Oracle过程错误,但SQL脚本自行运行正常

ikfrs5lh  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(150)

尝试使用下面的SQL脚本实现每天运行一次的脚本:

UPDATE WO_OPERATION wo_sub 
SET wo_sub.DUE_DATE = (SELECT wo_main.DUE_DATE 
                       FROM WO_OPERATION wo_main, WO_BOM wob 
                       WHERE wob.WOO_AUTO_KEY = wo_main.WOO_AUTO_KEY 
                         AND wob.WOB_AUTO_KEY = wo_sub.WOB_AUTO_KEY), 
    wo_sub.MANUAL_ECD = (SELECT wo_main.MANUAL_ECD 
                         FROM WO_OPERATION wo_main, WO_BOM wob 
                         WHERE wob.WOO_AUTO_KEY = wo_main.WOO_AUTO_KEY 
                           AND wob.WOB_AUTO_KEY = wo_sub.WOB_AUTO_KEY) 
WHERE wo_sub.WOB_AUTO_KEY > 0 
  AND wo_sub.OPEN_FLAG = 'T'

在Interactive SQL中手动运行SQL脚本时,不会出现错误。
创建过程并使用“executer procedure”运行后,将出现以下错误:
错误代码:
ORA-06550:第1行,第12列:PLS-00905:对象QCTL.UPDATE_SUBORDER_DUE_DATES无效
ORA-06550:第1行,第7列:PL/SQL:忽略语句
ORA-06512:在“QCTL.QC_SCHED_CUST_PKG”,第1632行
ORA-06512:第1行
ORA-06512:在“DBMS_ISCHED”,第185行
ORA-06512:在“DBMS_SCHEDULER”,第486行
ORA-06512:在“QCTL.QC_EMGR_PKG”,第1471行
ORA-06512:第2行
PL/SQL:ORA-00933:SQL命令未正确结束
第3列第6行编译错误
PL/SQL:SQL语句被忽略
第1列第5行编译错误
以下是程序:

CREATE OR REPLACE procedure QCTL.UPDATE_SUBORDER_DUE_DATES as

Begin

UPDATE WO_OPERATION wo_sub SET wo_sub.DUE_DATE = (select wo_main.DUE_DATE from WO_OPERATION wo_main, WO_BOM wob where wob.WOO_AUTO_KEY = wo_main.WOO_AUTO_KEY and wob.WOB_AUTO_KEY = wo_sub.WOB_AUTO_KEY), wo_sub.MANUAL_ECD = (select wo_main.MANUAL_ECD from WO_OPERATION wo_main, WO_BOM wob where wob.WOO_AUTO_KEY = wo_main.WOO_AUTO_KEY and wob.WOB_AUTO_KEY = wo_sub.WOB_AUTO_KEY) where wo_sub.WOB_AUTO_KEY > 0 and wo_sub.OPEN_FLAG = 'T'

commit;

END;

这应该适用于一个工作订单的到期日在维修设施的所有子woorkorders,我需要自动运行在每天的某个时间。
当手动运行SQL脚本时,没有错误...
编译整个过程会导致以下错误:
PL/SQL:ORA-00933:SQL命令未正确结束
第3列第6行编译错误
PL/SQL:SQL语句被忽略
第1列第5行编译错误
我做错了什么?

ylamdve6

ylamdve61#

实际上,这个过程中有一个错误。每个语句都必须以分号字符正确终止。UPDATE不是;因此出现了错误。
过程已创建,但未成功(您应该注意Oracle报告的消息)。

CREATE OR REPLACE procedure QCTL.UPDATE_SUBORDER_DUE_DATES as

Begin

UPDATE WO_OPERATION wo_sub SET 
  wo_sub.DUE_DATE = (select wo_main.DUE_DATE 
                     from WO_OPERATION wo_main, WO_BOM wob 
                     where wob.WOO_AUTO_KEY = wo_main.WOO_AUTO_KEY 
                       and wob.WOB_AUTO_KEY = wo_sub.WOB_AUTO_KEY), 
  wo_sub.MANUAL_ECD = (select wo_main.MANUAL_ECD 
                       from WO_OPERATION wo_main, WO_BOM wob 
                       where wob.WOO_AUTO_KEY = wo_main.WOO_AUTO_KEY 
                         and wob.WOB_AUTO_KEY = wo_sub.WOB_AUTO_KEY) 
  where wo_sub.WOB_AUTO_KEY > 0 
    and wo_sub.OPEN_FLAG = 'T';
                              ^
commit;                       |
                 this semi-colon is missing
END;
/

**[编辑]**在您评论您得到ORA-00933错误后;在这种情况下,你做错了,因为在我代码中没有这样的错误。

这里有一个演示。
示例表(因为你没有发布自己的信息;下一次,请提供尽可能多的信息,以便我们不必猜测):

SQL> create table wo_operation
  2    (due_date     date,
  3     woo_auto_key number,
  4     wob_auto_key number,
  5     open_flag    varchar2(1),
  6     manual_ecd   number);

Table created.

SQL> create table wo_bom
  2    (woo_auto_key number,
  3     wob_auto_key number);

Table created.

程序:

SQL> create or replace procedure update_suborder_due_dates as
  2  begin
  3    update wo_operation wo_sub set
  4    wo_sub.due_date = (select wo_main.due_date
  5                       from wo_operation wo_main, wo_bom wob
  6                       where wob.woo_auto_key = wo_main.woo_auto_key
  7                         and wob.wob_auto_key = wo_sub.wob_auto_key),
  8    wo_sub.manual_ecd = (select wo_main.manual_ecd
  9                         from wo_operation wo_main, wo_bom wob
 10                         where wob.woo_auto_key = wo_main.woo_auto_key
 11                           and wob.wob_auto_key = wo_sub.wob_auto_key)
 12    where wo_sub.wob_auto_key > 0
 13      and wo_sub.open_flag = 'T';
 14    commit;
 15  end;
 16  /

Procedure created.

程序已创建。没有ORA-00933什么都没有重新检查自己的代码。

相关问题