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@