首页 > 解决方案 > 没有 IN OUT 参数的插入语句的 Oracle 存储过程

问题描述

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

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 错误: := 。(@%;

如何执行具有插入语句的存储过程,以及如何在作业调度程序中调用该存储过程?

标签: oracle11g

解决方案


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

EXEC TEST_INSERT;

或自己创建没有该EXEC关键字的块:

BEGIN
  TEST_INSERT;
END;
/

您将在调度程序中使用后者,因为前者是客户端命令,而不是调度程序可以识别的内容。


您的程序有几个错误;您有格式错误的不必要的块嵌套(在声明后立即插入),您没有在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当您从调度程序运行此调用时,调用将无济于事。


推荐阅读