Oracle存储过程用于无IN OUT参数的插入语句。
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错误,错误信息为期望以下之一:
:= . ( @ % ;
如何执行包含插入语句的存储过程,并如何在作业调度程序中调用这个存储过程?
问题原因:
该问题的原因是存储过程中存在多个错误,例如多余的嵌套块、未声明的变量等。
解决方法:
下面是修复后的存储过程代码:
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`中添加,或者反之,或者在两个表中添加了数据类型不同的列(例如数字和日期),存储过程仍然可以正常工作。