2010-10-01 66 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