Loops 游标提前终止的DB2循环语句

Loops 游标提前终止的DB2循环语句,loops,db2,Loops,Db2,我在DB2iSeries V5R3M0中有一个存储过程,它打开一个游标并输入一个循环语句。循环从输入工作队列表中获取下一行,处理该记录,然后从输入表中删除该行。该过程工作正常,只是在循环终止之前处理了随机数目的行—通常是1行,有时是2行,有时是3行 有人知道为什么会提前结束吗?我在逻辑中看不到任何错误,所以我假设这可能与删除输入行有关,但在这种情况下,为什么它有时处理2或3行 以下是该程序的精简版本:- CREATE PROCEDURE DOTRANSFER ( OUT PROCESSED I

我在DB2iSeries 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@

我不知道是什么导致itv看起来像是从光标上删除清晰记录?但是,您是否尝试过定位删除:声明游标。。。对于更新…,后跟从…删除。。。当前的。我不知道这是否也会起作用。谢谢,我可以试试。是的,在处理记录时,我正在从输入游标中删除记录-记录可能随时都会被添加,因此我无法在最后执行批量删除。如果您希望循环并获取可能具有相同PTNO值的两行,请注意,删除操作将在处理第一行后立即尝试删除这两行。从这个意义上讲,您正在对匹配WHERE子句的所有行执行一种“批量删除”。两行将被删除,尽管您只获取了一行。这就是为什么只删除当前行的一个重要原因。