КУРСОР mysql — НЕ УДАЕТСЯ ВЫПОЛНИТЬ ИТЕРАЦИЮ ПО ЗАПИСЯМ

#mysql #cursor

#mysql #курсор

Вопрос:

КУРСОР НЕ ПЕРЕХОДИТ К ОПЕРАТОРУ ELSE. ЧТО я ДЕЛАЮ НЕ ТАК? КАК я МОГУ ОТЛАЖИВАТЬ В MYSQL? Я пытаюсь получить список идентификаторов задач с нулевыми значениями, а затем для каждого идентификатора задачи я вызываю SP для создания начальных данных и даты выполнения отсутствующих задач (больше, чем max (start_date доступно) до current_date

 DROP PROCEDURE IF EXISTS zcursor_ADDTA1;
DELIMITER ;;
CREATE PROCEDURE zcursor_ADDTA1(
#out retCount int
)
BEGIN
  #DECLARE C_ID INT;
  DECLARE C_TASK_ID INT;
  DECLARE C_pattern varchar(100);
  DECLARE C_REM INT;
  DECLARE ACT_T_STTM VARCHAR(100);
  DECLARE ACT_T_DTTM VARCHAR(100);
  DECLARE TZ VARCHAR(100);
  DECLARE T_STDT DATE;
  DECLARE T_EXDT DATE;
  DECLARE retCount INT;
  DECLARE done INT DEFAULT FALSE;
  DECLARE TA_MAX_ST_DT DATE;
  #DECLARE P1 INT;

  DECLARE cursor_i CURSOR FOR  SELECT  TASK_ID, PATTERN, reminder_days_before,  ACTUAL_TASK_START_TIME,ACTUAL_TASK_DUE_TIME,TIMEZONE,
  START_DT,EXP_DT FROM OCC_ML_TASK_RECURRENCE TR WHERE PATTERN = 'DAILY' AND CALENDAR_TYPE='' AND IS_CANCELED =0 AND EXP_DT>CURRENT_DATE();

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    SET retCount = 0;
  OPEN cursor_i;
  read_loop: LOOP
    FETCH  NEXT FROM cursor_i INTO  C_TASK_ID,C_pattern,C_REM,ACT_T_STTM,ACT_T_DTTM,
    TZ,T_STDT,T_EXDT;
    IF done THEN
      LEAVE read_loop;
    ELSE
    SELECT MAX(TA.START_DTM)FROM 
    OCC_ML_TASK_ACTIVITY TA
    WHERE TA.TASK_ID=C_TASK_ID INTO TA_MAX_ST_DT;
    
    SELECT DATE_ADD(TA_MAX_ST_DT,INTERVAL 1 DAY) INTO TA_MAX_ST_DT;
    
    WHILE (TA_MAX_ST_DT<=CURRENT_DATE())
        DO
        BEGIN 
          IF WEEKDAY(TA_MAX_ST_DT)=4 THEN
             CALL ZTA_MISSINGDATA_INSERT(C_TASK_ID ,TA_MAX_ST_DT);
             SELECT DATE_ADD(TA_MAX_ST_DT,INTERVAL 3 DAY)INTO TA_MAX_ST_DT;
          ELSEIF WEEKDAY(TA_MAX_ST_DT)=5 THEN
             #"NO INSERT "
             SELECT DATE_ADD(TA_MAX_ST_DT,INTERVAL 2 DAY)INTO TA_MAX_ST_DT;
          ELSEIF  WEEKDAY(TA_MAX_ST_DT)=6 THEN
        #"NO INSERT "
             SELECT DATE_ADD(TA_MAX_ST_DT,INTERVAL 1 DAY)INTO TA_MAX_ST_DT;
          ELSE
             CALL ZTA_MISSINGDATA_INSERT(C_TASK_ID ,TA_MAX_ST_DT);
             SELECT DATE_ADD(TA_MAX_ST_DT,INTERVAL 1 DAY) INTO TA_MAX_ST_DT;
          END IF;
        
        END;
    END WHILE;
    END IF;
    
    

  END LOOP;
  CLOSE cursor_i;

END;
;;
  

Комментарии:

1. Убедитесь, что оператор none SELECT в теле ЦИКЛА возвращает нулевые строки — это приведет к запуску вашего обработчика. Попробуйте добавить SET done := FALSE; непосредственно перед FETCH .

2. КАК я МОГУ ВЫПОЛНИТЬ ОТЛАДКУ В MYSQL? Создайте служебную log таблицу ( CREATE TABLE log(record TEXT); ). Добавьте инструкции INSERT, которые сохраняют значения промежуточных переменных и уникальный собственный номер в эту служебную таблицу ( INSERT INTO log CONCAT('Point:', 123, ', var1=', var1, ', var2=', var2, ...); ). Выполните процедуру, затем исследуйте содержимое таблицы, извлеките поток выполнения и измените значения переменных.

3. Завершается ли ваш SP или он находится в бесконечном цикле?

4. он завершается после предложения ‘if done’