我是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_id
和machine_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)
);
答案 0 :(得分:0)
"我想这样做,以便PaperRoll_ID等于Worker_id索引,而不是索引值(我的意思是,索引1是我添加的第一个Worker_id,2是第二个,依此类推,直到500(工人数量)"
关键数据库的工作原理并非如此。您应该在invoice_paper
和machine_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)
,这是丑陋的。在这些情况下,最好使用单个列代理主键并使用其他唯一约束强制执行复合键。