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

时间:2016-01-06 19:48:33

标签: stored-procedures db2 ibm-midrange db2-400

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

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

如何在单个存储过程中为特定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  '' 
我忘记提到上面的代码似乎创建了一个无限循环。当我打电话给程序时,它只是继续运行而且不会停止。我让它在杀死之前运行长达10分钟,而且考虑到这些表中的记录数量,我认为这将花费很长时间。

1 个答案:

答案 0 :(得分:3)

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

.container div.col-xs-3 {
  padding: 0;
}

基本上,您将要处理其信号的语句包装在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 块中,并在该块内声明处理程序。