2017-01-23 136 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)這是醜陋的。在這種情況下,最好有一個列代理主鍵,並使用一個附加的唯一約束來執行復合鍵。