DB2 for i 存储过程中的多个继续处理程序

Multiple Continue Handlers in DB2 for i Stored Procedure

我在 IBM i V7R2 TR3 上使用 DB2 for i

我正在尝试编写一个包含两个 SELECT 语句的存储过程。第一个我用游标循环,第二个在该循环内部。如果记录是从第二个(内部)SELECT 编辑的 return,那么我需要跳出循环,否则继续。我看过 Exception Handlers 的示例,但是当我尝试实现它们时,我会在第一次迭代时被抛出循环。我关于为什么 Exception Handlers 对我不起作用的假设是因为我在全局级别设置 Exception Handler 并且当第二个(内部)SELECT return 为零时第一次迭代期间的结果(主要是 return 零行),异常处理程序被触发,我跳出存储过程而不仅仅是循环。

如何在单个存储过程中为特定 SQL 语句设置多个 Exception Handlers?我读过 DB2 中的复合语句,但无法弄清楚如何指定 Exception Handler 用于哪个语句。

https://www-01.ibm.com/support/knowledgecenter/SSEPEK_11.0.0/com.ibm.db2z11.doc.sqlref/src/tpc/db2z_compoundstatement4nativesqlpl.html

我已经尝试了一些 Exception Handlers 的替代方法,这是我目前所拥有的。我对 Exception Handlers 并没有死心塌地,但如果知道如何使用多个 Exception Handlers.

就好了

这是我的存储过程(已更改lib/tables)供参考,如果有帮助:

DECLARE EOF1 INT DEFAULT 0 ; 
DECLARE EOF2 INT DEFAULT 0 ; 
DECLARE CURMATCH CHAR ( 20 ) DEFAULT '' ; 
DECLARE CURPREFIX CHAR ( 20 ) DEFAULT '' ; 
DECLARE PREFIXES CURSOR FOR 
    SELECT  TRIM ( PREFIX ) || '%' 
    FROM    MYLIB / PREFIXTABLE 
    ORDER BY    LENGTH ( TRIM ( PREFIXCOL ) ) DESC , TRIM ( PREFIXCOL ) DESC ; 



OPEN PREFIXES ; 
WHILE EOF1 = 0 DO 

    FETCH FROM PREFIXES INTO CURPREFIX ; 

    IF TRIM ( CURPREFIX ) = '' THEN 
        SET EOF1 = 1 ; 
    END IF ; 

    SELECT  DISTINCT BASEITEM , 
        SUBSTR ( BASEITEM , 
        ( LENGTH ( TRIM ( CURPREFIX ) ) + 1 ) , ( 20 - LENGTH ( TRIM ( CURPREFIX ) ) ) 
    ) INTO CURMATCH 
    FROM    MYLIB / ITEMTABLE 
    WHERE   BASEITEM = ITEM 
    AND CASE 
            WHEN BASEITEM LIKE '' || CURPREFIX || '' THEN 1 
            ELSE 0 
        END = 1 ;        

    IF ( TRIM ( CURMATCH ) <> '' ) THEN 
        SET BASEITEM = TRIM ( CURMATCH ) ; 
        SET EOF2 = 1 ; 
    END IF ; 
    IF EOF2 <> 0 THEN 
        SET EOF1 = 1 ; 
    END IF ; 

END WHILE ; 
CLOSE PREFIXES ; 

IF(EOF2 = 0) THEN 
    SET BASEITEM = 'NOT FOUND'; 
END IF; 

存储过程设置为接受定义的 2 个参数:

IN ITEM CHAR(20) CCSID 37 DEFAULT  ''  , 
INOUT BASEITEM CHAR(20) DEFAULT  '' 

我忘了提到上面的代码似乎创建了一个无限循环。当我调用该过程时,它只会保持 运行ning 而不会停止。我让它 运行 在杀死它之前长达 10 分钟,考虑到这些表中的记录数量,我认为不会花那么长时间。

信号(异常)处理程序在声明它们的块中是本地的。过程主体是最外层的块,但您可以定义嵌套块。由于您没有 post 您的代码(带有信号处理程序的代码),我无法确切地告诉您如何修改它,但总的来说它看起来像这样:

CREATE PROCEDURE yourproc
...
BEGIN
  DECLARE prefixes CURSOR FOR ...
  OPEN PREFIXES ; 
  WHILE EOF1 = 0 DO 
    FETCH FROM PREFIXES INTO CURPREFIX ; 
    BEGIN -- inner block
      DECLARE CONTINUE HANDLER FOR ...
      ... -- do whatever
    END; -- inner block
  END WHILE ; 
  ...
END -- procedure

基本上,您将要处理其信号的语句包装在 BEGIN ... END 块中,并在该块内声明处理程序。