Различение в курсоре не работает…?

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;
Теги:

1 ответ

0

Конструкция курсора в вашем коде сформирована неправильно. Последняя строка, которую будет читать курсор, читается дважды. Курсор должен быть закрыт после достижения последней строки.

Что здесь происходит, так это то, что обход курсора достигает последней строки, затем запускается обработчик ошибок для SQLSTATE, затем выполняется = 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню