Oracle存储过程用于无IN OUT参数的插入语句。

32 浏览
0 Comments

Oracle存储过程用于无IN OUT参数的插入语句。

我创建了一个用于插入语句的存储过程:

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;    
/* 这是我创建的进程日志 */
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错误,错误信息为期望以下之一:

:= . ( @ % ;

如何执行包含插入语句的存储过程,并如何在作业调度程序中调用这个存储过程?

0
0 Comments

问题原因:

该问题的原因是存储过程中存在多个错误,例如多余的嵌套块、未声明的变量等。

解决方法:

下面是修复后的存储过程代码:

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; 
/

在修复后的代码中,多余的嵌套块已被移除,变量`TotalUpd`被声明并用于`row_count`,并且将`dbms_output`的调用语句注释掉了。

需要注意的是,在插入和选择语句中,应该明确列出要插入和选择的列。这样,即使有人向`table_c`中添加了列而没有向`table_1`中添加,或者反之,或者在两个表中添加了数据类型不同的列(例如数字和日期),存储过程仍然可以正常工作。

0