光标不同不起作用......?

时间:2010-10-01 15:08:08

标签: mysql

提示,我无法理解的东西,光标中的区别不起作用或什么? 有一个带有不同的游标,我在循环中得到它。如果来自游标的请求单独执行,则返回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;

1 个答案:

答案 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