почему MySQL Trigger, который использует курсор, выбирает только одно значение - PullRequest
0 голосов
/ 16 мая 2019

Я создал триггер после INSERT для таблицы AcademicYearTermLevel , который использует значение курсора, извлеченное из другого запроса.Я хочу использовать каждое значение курсора в цикле while и вставлять строки в таблицу SubjectYearTermLevel .

DROP TRIGGER IF EXISTS after_academicyearterm_insert
DELIMITER $$
CREATE TRIGGER after_academicyearterm_insert
AFTER INSERT 
ON AcademicYearTerm
FOR EACH ROW
BEGIN

  DECLARE temp INT;
  DECLARE subj_done, form_done BOOLEAN DEFAULT FALSE;
  DECLARE s_id INT;
  DECLARE curSubject CURSOR FOR SELECT subject_id FROM Subject;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET subj_done = TRUE;

  SET temp = 1;

  OPEN curSubject;
  cur_subject_loop:   LOOP
  FETCH FROM curSubject INTO s_id;

    IF subj_done THEN
    CLOSE curSubject;
    LEAVE cur_subject_loop;
    END IF;

    WHILE temp <= 6 DO
      INSERT INTO SubjectYearTermLevel VALUES (NULL, s_id, NEW.yearTerm_id, temp);
      SET temp = temp + 1;
    END WHILE


  END LOOP cur_subject_loop;
END$$
DELIMITER ;

Однако проблема в том, что курсор, похоже, извлекает только одно значение из SELECT запрос

1 Ответ

0 голосов
/ 17 мая 2019

Глупая ошибка, я SET temp = 1; вне FETCH, и, следовательно, после первого значения курсора цикл while никогда не запускался.

  -- SET temp = 1;

  OPEN curSubject;
  cur_subject_loop:   LOOP
  FETCH FROM curSubject INTO s_id;
    SET temp = 1;

    IF subj_done THEN
    CLOSE curSubject;
    LEAVE cur_subject_loop;
    END IF;

    1_to_6_temp: WHILE temp <= 6 DO
      INSERT INTO SubjectYearTermLevel VALUES (NULL, s_id, NEW.yearTerm_id, temp, -1);
      SET temp = temp + 1;
    END WHILE 1_to_6_temp;
  -- CLOSE curSubject;
  END LOOP cur_subject_loop;
...