如何从 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 中调用的存储过程。

玩得开心!

statements-set-transaction

control-example-using-transaction-logging-file-start-application

definition-example-jobs-commitment-definitions

谢谢@Jairo,我成功了。

您的解决方案是正确的并且有效,唯一的挑战是 SP2 没有任何导致问题的 SQL 语句,我将 SP2 中的语句转换为 SQL 语句并且有效完全没问题。