#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’