如何从 SQL 存储过程调用外部存储过程并处理承诺控制
How to call external stored procedure from SQL stored procedure and handle commitment control
我试图通过传递两个参数从 Sql 存储过程调用外部存储过程。其中一个参数预计 return 返回一个字符串值,当它到达时我需要停止在任何文件中提交数据。
解释一下情况 - SP1(SQL存储过程)会调用SP2(外部存储过程),SP2会调用RPGLE程序PGM1,PGM1会调用另一个RPGLE程序PGM2.
现在我的任务是处理 SP1 的 PGM2 中使用的文件 1 和文件 2 的提交控制。如果在任何时候 File1 被更新并且 File2 在更新任何记录时出错,则 File 1 中的数据也应该回滚。但这种回滚应该发生在 SP1 中。
到目前为止,我已经尝试将这个问题分成两部分-
PARTA - 如何从 SQL 存储过程调用外部存储过程。
PARTB - 如何在本质上处理SQL存储过程中的承诺,如果PGM2返回错误数据应该回滚。
下面是到目前为止我已经尝试过的代码片段。但是运气不好。
CREATE OR REPLACE PROCEDURE MYLIB.SP1 (
IN PRINPUT CHAR(1200) ,
INOUT PRERR CHAR(50) )
SPECIFIC MYLIB.SP1
BEGIN
DECLARE SQLSTATE CHAR(5) DEFAULT ' ';
DECLARE SQLCODE INTEGER DEFAULT 0;
CALL MYLIB.SP2(PRINPUT, PRERR);
IF SQLCODE = 0 THEN
COMMIT;
ENDIF;
END
任何 suggestion/Guidance 不胜感激。
试试这个我的朋友:
在 SP1
BEGIN
DECLARE SQLSTATE CHAR(5) DEFAULT ' ';
DECLARE SQLCODE INTEGER DEFAULT 0;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
CALL MYLIB.SP2(PRINPUT, PRERR);
IF SQLCODE = 0 THEN
COMMIT;
ELSE
ROLLBACK;
ENDIF;
END
答案:
PARTA:如果 Ext Stored Proc 存在,那么您的调用方式就是正确的。
PARTB:设置的事务范围是从发布到执行提交或回滚时更改的所有行。请记住,每个 SQL 存储过程都在 *caller actgrp 上运行,因此,您需要检查您的 RPG 程序是否也在 *caller 上运行。
最后,我上次测试时,恐龙仍然在地球上行走,SQL Stored Proc 上的提交限定了使用内部调用的 RPG 程序所做的更改,但 RPG STRCMTCTL 没有得到所做的更改关于 SQL 在 RPG 中调用的存储过程。
玩得开心!
control-example-using-transaction-logging-file-start-application
谢谢@Jairo,我成功了。
您的解决方案是正确的并且有效,唯一的挑战是 SP2 没有任何导致问题的 SQL 语句,我将 SP2 中的语句转换为 SQL 语句并且有效完全没问题。
我试图通过传递两个参数从 Sql 存储过程调用外部存储过程。其中一个参数预计 return 返回一个字符串值,当它到达时我需要停止在任何文件中提交数据。
解释一下情况 - SP1(SQL存储过程)会调用SP2(外部存储过程),SP2会调用RPGLE程序PGM1,PGM1会调用另一个RPGLE程序PGM2.
现在我的任务是处理 SP1 的 PGM2 中使用的文件 1 和文件 2 的提交控制。如果在任何时候 File1 被更新并且 File2 在更新任何记录时出错,则 File 1 中的数据也应该回滚。但这种回滚应该发生在 SP1 中。
到目前为止,我已经尝试将这个问题分成两部分-
PARTA - 如何从 SQL 存储过程调用外部存储过程。
PARTB - 如何在本质上处理SQL存储过程中的承诺,如果PGM2返回错误数据应该回滚。
下面是到目前为止我已经尝试过的代码片段。但是运气不好。
CREATE OR REPLACE PROCEDURE MYLIB.SP1 (
IN PRINPUT CHAR(1200) ,
INOUT PRERR CHAR(50) )
SPECIFIC MYLIB.SP1
BEGIN
DECLARE SQLSTATE CHAR(5) DEFAULT ' ';
DECLARE SQLCODE INTEGER DEFAULT 0;
CALL MYLIB.SP2(PRINPUT, PRERR);
IF SQLCODE = 0 THEN
COMMIT;
ENDIF;
END
任何 suggestion/Guidance 不胜感激。
试试这个我的朋友: 在 SP1
BEGIN
DECLARE SQLSTATE CHAR(5) DEFAULT ' ';
DECLARE SQLCODE INTEGER DEFAULT 0;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
CALL MYLIB.SP2(PRINPUT, PRERR);
IF SQLCODE = 0 THEN
COMMIT;
ELSE
ROLLBACK;
ENDIF;
END
答案:
PARTA:如果 Ext Stored Proc 存在,那么您的调用方式就是正确的。
PARTB:设置的事务范围是从发布到执行提交或回滚时更改的所有行。请记住,每个 SQL 存储过程都在 *caller actgrp 上运行,因此,您需要检查您的 RPG 程序是否也在 *caller 上运行。
最后,我上次测试时,恐龙仍然在地球上行走,SQL Stored Proc 上的提交限定了使用内部调用的 RPG 程序所做的更改,但 RPG STRCMTCTL 没有得到所做的更改关于 SQL 在 RPG 中调用的存储过程。
玩得开心!
control-example-using-transaction-logging-file-start-application
谢谢@Jairo,我成功了。
您的解决方案是正确的并且有效,唯一的挑战是 SP2 没有任何导致问题的 SQL 语句,我将 SP2 中的语句转换为 SQL 语句并且有效完全没问题。