我在IBM i V7R2 TR3上使用DB2 for i
我正在尝试编写一个包含两个SELECT
语句的存储过程。第一个是我用光标循环,第二个是在循环内部。如果从第二个(内部)SELECT
返回一条记录,那么我需要突破循环,否则继续。我已经看过Exception Handlers
的例子,但是当我尝试实现它们时,我会在第一次迭代时被抛出循环。关于为什么Exception Handlers
对我不起作用的假设是因为我在全局级别设置Exception Handler
,而在第二个(内部)SELECT
返回零结果时第一次迭代(它将主要返回零行),异常处理程序是触发器,我打破了存储过程而不仅仅是循环。
如何在单个存储过程中为特定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 ''
我忘记提到上面的代码似乎创建了一个无限循环。当我打电话给程序时,它只是继续运行而且不会停止。我让它在杀死之前运行长达10分钟,而且考虑到这些表中的记录数量,我认为这将花费很长时间。
答案 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
块中,并在该块内声明处理程序。