Oracle:存储过程错误

时间:2017-01-23 12:52:21

标签: sql oracle stored-procedures

我是SQL的新手,我必须创建一个存储过程。

我的想法是,我想输入我的PaperRoll_ID并获取" Worker_ID"。由于表中的PaperRoll_ID值为1到500且我的Worker_id值为1500到2000,因此我想使PaperRoll_ID等于Worker_id索引,而不是索引值(我的意思是,索引1是我添加的第一个Worker_id,2是第二个,依此类推,直到500(工人数))。 PaperRoll_ID位于表invoice_Paper中的Worker_idmachine_operator表格中。

很抱歉,如果它很难理解,但我缺乏很多SQL知识,所以对我来说表达自己有点困难。

create or replace PROCEDURE name_worker(pi IN NUMBER, mi OUT NUMBER) IS
BEGIN
    Select q.worker_ID2 INTO mi 
    from invoice_paper z,machine_operator o 
    where z.PaperRoll_ID=pi AND o.WORKER_ID2 = q.worker_ID2;
END;

表格是

create Table invoice_paper(
PaperRoll_ID Number(10) constraint ppr_id not null,
Single_Layer Varchar(20) Default 'None in stock',
Double_Layer Varchar(20) Default 'None in stock',
Manufacturer_FactoryID Integer,
primary key(PaperRoll_ID),
Constraint pprid_invoice Foreign key (Manufacturer_FactoryID) References   Paper_Factory(Factory_ID)
 );

create table machine_operator(
Insurence_ID number(10) constraint in_numb not null,
Worker_ID2 number(10) constraint worka_id not null,
operator_name Varchar(20),
Email Varchar(30),
Primary key (Insurence_ID, Worker_ID2),
Constraint wka_id Foreign key(Worker_ID2) References worker(worker_id)
);

1 个答案:

答案 0 :(得分:0)

  

"我想这样做,以便PaperRoll_ID等于Worker_id索引,而不是索引值(我的意思是,索引1是我添加的第一个Worker_id,2是第二个,依此类推,直到500(工人数量)"

关键数据库的工作原理并非如此。您应该在invoice_papermachine_operator之间使用外键强制执行此类关系,可能需要将Worker_ID2列添加到invoice_paper (*)

除此之外,您还不清楚您尝试通过手术实现的目标,因此很难提出更好的建议。但是,让我们假设您要做的是让下一位免费工作人员转到invoice_paper

create or replace PROCEDURE name_worker(mi OUT NUMBER) IS
BEGIN
     Select min(o.worker_ID2) INTO mi 
     from machine_operator o 
     where o.WORKER_ID2 not in (select p.worker_ID2 
                                from invoice_paper p)
     ;
END;

保存为易于比较的过程,尽管这种事情通常被写为带有返回值的FUNCTION。

(*)注意machine_operator有一个复合主键。如果这是正确的,外键必须是(Insurence_ID, Worker_ID2),这是丑陋的。在这些情况下,最好使用单个列代理主键并使用其他唯一约束强制执行复合键。