oracle11g - 没有 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 错误: := 。(@%;
如何执行具有插入语句的存储过程,以及如何在作业调度程序中调用该存储过程?
解决方案
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
当您从调度程序运行此调用时,调用将无济于事。
推荐阅读
- css - Angular 7 - 更改组件的背景颜色
- javascript - 将 Nowjs 托管的 Node.js 服务器连接到 MongoDB Atlas DB
- jquery - 使用 AJAX 编辑返回的数据并发送回编辑的数据
- amazon-web-services - 无法在 AWS Lambda 中使用 sequelize 连接到 RDS mysql
- javascript - graphqljs - 如何获取文件名和错误行
- firebase - 如何仅使用 id 在 Firebase 中检索文档
- php - 如何使用 PHP 计算网站(包含所有内容)的加载时间?
- haskell - 如何使用堆栈运行 yesod hello world 应用程序?
- ios - Fastlane iOS 测试在本地通过,但不是来自 Jenkins
- c# - 为什么 Lambda 表达式会返回 System.Linq.Enumerable+WhereSelectEnumerableIterator`2 作为结果