我试图通过传递两个参数从Sql存储过程调用外部存储过程。其中一个参数应该返回一个字符串值,当该值到达时,我需要停止任何文件中要提交的数据。
说明情况- SP1(SQL存储过程)将调用SP2(外部存储过程),后者将调用RPGLE程序PGM 1,后者将调用另一个RPGLE程序PGM 2。
现在,我的任务是处理SP1中PGM 2中使用的File 1和File 2的提交控制。如果在任何时候更新了File 1,而File 2在更新任何记录时出现错误,则File 1中的数据也应该回滚。但这种回滚应该发生在SP1中。
到目前为止,我试着把这个问题分成两部分-
PARTA-如何从SQL存储过程调用外部存储过程
PARTB-如何处理SQL存储过程中的提交,如果PGM 2返回错误数据,则应回滚。
下面是我到目前为止尝试过的一段代码。但是没有运气。
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
如有任何建议/指导,敬请谅解。
2条答案
按热度按时间5uzkadbs1#
试试这个我的朋友:在SP1上
答案:
如果Ext Stored Proc存在,那么你调用它的方式就是正确的。
PARTB:set事务处理的作用域是从发出到执行commit或rollback的所有更改的行。请记住,每个SQL存储过程都在 *caller actgrp上运行,因此,您需要检查RPG程序是否也在 *caller上运行。
最后,我上次测试时,dinos仍然在地球上行走,SQL存储过程上的提交确定了使用内调用的RPG程序所做的更改的范围,但RPG STRCMTCTL没有获得在RPG内调用的SQL存储过程上所做的更改。
玩得开心点!
statements-set-transaction
control-example-using-transaction-logging-file-start-application
definition-example-jobs-commitment-definitions
fiei3ece2#
谢谢你@Jairo,我让它工作了。
您的解决方案是正确的,并且有效,唯一的挑战是SP2没有任何SQL语句,这是导致问题的原因,我将SP2中的语句转换为SQL语句,它完全正常工作。