我在 DB2 (iSeries V5R3M0) 中有一个存储过程,它打开一个游标并进入一个循环语句。循环从输入(工作队列)表中获取下一行,处理记录,然后从输入表中删除该行。该过程工作正常,除了在循环终止之前处理随机数量的行 - 通常是 1 行,有时是 2 行,偶尔是 3 行。
有谁知道为什么它会提前完成?我在逻辑中看不到任何错误,所以我假设它可能与删除输入行有关,但在那种情况下,为什么它有时会处理 2 或 3 行?
这是该程序的精简版本:-
CREATE PROCEDURE DOTRANSFER (
OUT PROCESSED INTEGER)
LANGUAGE SQL
BEGIN
DECLARE V_PTNO INTEGER ;
*** lot more declares
--
DECLARE AT_END SMALLINT DEFAULT 0 ;
DECLARE NOT_FOUND CONDITION FOR SQLSTATE '02000' ;
DECLARE CURREQUESTS ASENSITIVE NO SCROLL CURSOR WITH HOLD WITHOUT RETURN FOR
SELECT *
FROM PENDTRPF
ORDER BY PTNO ;
DECLARE CONTINUE HANDLER FOR NOT_FOUND
SET AT_END = 1 ;
--
-- Initialise
--
SET PROCESSED = 0 ;
OPEN CURREQUESTS ;
FETCH_LOOP : LOOP
--
-- Fetch the next transfer request
--
FETCH CURREQUESTS INTO
V_PTNO , ...;
IF AT_END <> 0 THEN
LEAVE FETCH_LOOP ;
END IF ;
*** Initialisation code
--
-- Start the update
--
COMMIT ;
*** Update or insert target table records
--
-- Done
--
DELETE FROM PENDTRPF WHERE PTNO = V_PTNO ;
SET PROCESSED = PROCESSED + 1 ;
COMMIT ;
END LOOP ;
END@