提示,我无法理解的东西,光标中的区别不起作用或什么? 有一个带有不同的游标,我在循环中得到它。如果来自游标的请求单独执行,则返回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 :(得分:1)
代码中的游标构造未正确形成。光标将读取的最后一行正在读取两次。光标到达最后一行后应该关闭。
这里发生的是光标遍历到达最后一行然后触发SQLSTATE的错误处理程序,然后完成= 1.此时它尚未关闭。光标保持打开状态,再次遍历同一行,直到它到达UNTIL完成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