2017-01-23 168 views
0

我真的很陌生,我必须创建一个存储过程。Oracle:存储过程错误

我的想法是,我想输入我的PaperRoll_ID并获得“Worker_ID”。由于表中的PaperRoll_ID值是从1到500,而我的Worker_id值是从1500到2000,所以我想让PaperRoll_ID等于Worker_id索引,而不是索引值(我的意思是索引1是第一个Worker_id我补充说,2是第二等,直到500(工人数))。 PaperRoll_ID位于表machine_operator中的表invoice_PaperWorker_id中。

对不起,如果它很难理解,但我缺乏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) 
); 
+0

样本数据和期望的结果将真正帮助表达您想要做的事情。 –

+1

@specbk q是您的查询中的表的别名? –

+2

什么数据库对象由别名'q'表示。它不映射到FROM子句中的任何内容。就目前而言,'invoice_paper'和'machine_operator'之间没有连接标准。 – APC

回答

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; 

保存为便于比较的过程中,虽然这种事情通常被写成一个返回值,而不是一个函数。


(*)只注意到machine_operator具有化合物主键。如果这是正确的外键将不得不是(Insurence_ID, Worker_ID2)这是丑陋的。在这种情况下,最好有一个列代理主键,并使用一个附加的唯一约束来执行复合键。