【问题标题】:Oracle store procedure for insert statement with no IN OUT parameters没有 IN OUT 参数的插入语句的 Oracle 存储过程
【发布时间】:2018-12-23 18:18:21
【问题描述】:

我为插入语句创建了一个存储过程:

CREATE OR REPLACE PROCEDURE TEST_INSERT
IS /* **WHEN TO USE IS AND AS** */
BEGIN    
declare row_cnt number(30):=0;
INSERT INTO TABLE_1
SELECT * FROM TABLE_C;    
/* process log I created like this */

BEGIN
dbms_output.put_line ('process begins : ' || to_char(SYSDATE, 'hh24:mi:ss'));
     TotalUpd := SQL%ROWCOUNT;
UPDATE table2 SET status = 'PROGRESS',row_cnt = TotalUpd  WHERE status is null;
dbms_output.put_line('Total Records Updated. : ' || TotalUpd);
COMMIT;    
end;
COMMIT;    
END; 

如何执行这个存储过程?我试过这样:

Begin
  EXEC TEST_INSERT;
end;

当期待以下其中一项时,它给了我 PLS-00103 错误: := 。 (@%;

带有insert语句的存储过程如何执行,在作业调度器中如何调用这个存储过程?

【问题讨论】:

  • 不是您的主要问题,而是:What is the difference between “AS” and “IS” in an Oracle stored procedure?。你的程序有几个语法错误,所以你真的在问如何调用它,或者如何修复它?
  • 如何修复并调用它??
  • FWIW,我倾向于在直接创建包、过程和函数时使用“AS”,在包内创建函数和过程时使用“IS”,因为这对我来说在语法上有意义;即“create is ”没有语言意义,但“ as ”可以。同样,“ is ”比“ as ”更有意义。 YMMV。

标签: oracle11g


【解决方案1】:

EXECEXECUTE 是用于匿名块的 SQL*Plus 和 SQL Developer(以及 SQLcl...)快捷方式,因此您可以将其用作:

EXEC TEST_INSERT;

或者在没有EXEC关键字的情况下自己创建块:

BEGIN
  TEST_INSERT;
END;
/

您将在调度程序中使用后者,因为前者是一个 client 命令,调度程序无法识别。


您的程序有几个错误;您有格式错误的不必要的块嵌套(在声明后立即插入),您没有在任何地方声明 TotalUpd,但似乎打算将其用于 row_count 等。这至少可以编译:

CREATE OR REPLACE PROCEDURE TEST_INSERT
IS
  TotalUpd pls_integer;
BEGIN    
  dbms_output.put_line ('process begins : ' || to_char(SYSDATE, 'hh24:mi:ss'));

  INSERT INTO TABLE_1
  SELECT * FROM TABLE_C;    

  TotalUpd := SQL%ROWCOUNT;
  UPDATE table2 SET status = 'PROGRESS',row_cnt = TotalUpd  WHERE status is null;
  dbms_output.put_line('Total Records Updated. : ' || TotalUpd);
  COMMIT;    
END; 
/

如果您的客户端支持,您可以使用show errors 查看编译错误,或查询user_errors 视图。此外,当您从调度程序运行此操作时,dbms_output 调用将无济于事。

【讨论】:

  • 对 OP 的补充说明:您应该列出要插入和选择的列,即它应该是 insert into table_1 (<column 1>, <column 2>, ...) select <column 1>, <column 2>, ... from table_c;。这样,如果有人将列添加到 table_c 而不是 table_1(反之亦然)或添加具有不同数据类型(例如数字和日期)的列,您的过程仍然可以工作。
猜你喜欢
  • 2010-09-19
  • 2013-11-02
  • 1970-01-01
  • 2011-07-29
  • 2012-04-18
  • 2014-10-30
  • 2019-04-26
  • 2012-03-11
  • 1970-01-01
相关资源
最近更新 更多