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
用于哪个语句。
我已经尝试了一些 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
块中,并在该块内声明处理程序。
我在 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
用于哪个语句。
我已经尝试了一些 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
块中,并在该块内声明处理程序。