2010-10-01 73 views
0

提示,我无法理解的东西,在游标中不同的东西不起作用或什么? 有一个独特的光标,我在循环中得到。如果请求从光标单独执行,则返回1条记录,如果清晰,则会有2条记录。循环游标与不同运行2次。光标不同不起作用...?

DECLARE cur CURSOR FOR 
    SELECT DISTINCT t.DATPR, A.ACCOUNT_NO 
    FROM postgkh.tt_krd t 
    INNER JOIN postgkh.account A ON t.LS = A.ACCOUNT_NO 
    INNER JOIN postgkh.resid RID USING(ACCOUNT_ID) 
    INNER JOIN postgkh.reseller R USING(RESELLER_ID) 
    WHERE r.RESELLER_ID = RID 
    ORDER BY A.ACCOUNT_ID; 
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; 
    OPEN cur; 
    REPEAT 
FETCH cur INTO PR_DATE,ACCID, ACCNO; 
SET LIM_FP = postgkh.GET_ACCOUNT_FP(ACCID) - INTERVAL 1 DAY; 
IF(LIM_FP>PR_DATE) THEN 
    IF(TMP IS NULL OR TMP<>ACCNO) THEN 
    SET TMP = ACCNO; 
    SET ERR = CONCAT(ERR,', ',ACCNO); 
    END IF; 
END IF; 
    UNTIL done END REPEAT; 
    CLOSE cur; 

回答

0

代码中的游标构造不正确。游标将读取的最后一行正在读取两次。游标到达最后一行后应该关闭。

这里发生的事情是,光标遍历到达最后一行,然后SQLSTATE的错误处理程序被触发,然后done = 1。它在那时还没有关闭。光标保持打开状态以再次遍历最后一行,直到它遇到UNTIL done END REPEAT。

我建议你不要对游标使用REPEAT-UNTIL结构。使用LOOP代替:

OPEN cur; 
curLoop: LOOP 
FETCH cur INTO PR_DATE,ACCID, ACCNO; 
IF (done) 
THEN 
    CLOSE cur; 
    LEAVE curLoop; 
END IF; 

... 

END LOOP curLoop; 

这段代码可以帮助:http://mysql-0v34c10ck.blogspot.com/2011/05/general-purpose-dynamic-cursor-part-3.html