【问题标题】:Oracle: stored procedure errorOracle:存储过程错误
【发布时间】:2017-01-23 12:52:21
【问题描述】:

我对 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)
);

【问题讨论】:

  • 样本数据和期望的结果确实有助于表达您想要做的事情。
  • @specbk q 是查询中哪个表的别名?
  • 别名q代表什么数据库对象。它不映射到 FROM 子句中的任何内容。就目前而言,invoice_papermachine_operator 之间没有加入标准。
  • 我的错误,别名应该是机器操作员表中的o
  • @RajatMishra - 这个答案与 ROWID 有关,它与 ROWNUM 完全不同。虽然它没有实际意义,但两者都不是解决 OP 问题的特别有用的方法。

标签: sql oracle stored-procedures


【解决方案1】:

“我想让 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),这很难看。在这些情况下,最好使用单列代理主键并使用附加唯一约束强制复合键。

【讨论】:

    猜你喜欢
    • 2015-05-02
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多