db2 如何从SQL存储过程调用外部存储过程并处理提交控制

yruzcnhs  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(255)

我试图通过传递两个参数从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

如有任何建议/指导,敬请谅解。

5uzkadbs

5uzkadbs1#

试试这个我的朋友:在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

答案:
如果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

fiei3ece

fiei3ece2#

谢谢你@Jairo,我让它工作了。
您的解决方案是正确的,并且有效,唯一的挑战是SP2没有任何SQL语句,这是导致问题的原因,我将SP2中的语句转换为SQL语句,它完全正常工作。

相关问题