【问题标题】:why does MySQL Trigger that uses cursor only fetch one value为什么使用游标的 MySQL 触发器只获取一个值
【发布时间】:2019-05-16 04:55:54
【问题描述】:

我在表 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 查询中获取一个值

【问题讨论】:

  • 在数据库中,只有当且仅当所有其他可能性都失败时,才会将游标用作最后的手段。您的描述听起来应该可以通过连接两个结果集的单个查询来实现。您能否添加示例结果(例如表 subject 的内容和预期结果 - 新行 - 在 tableB 中)。以及与插入行的关系(在tableA 中) - 目前您似乎没有使用有关当前行的任何信息,这通常是触发器的内容。

标签: mysql triggers cursor


【解决方案1】:

愚蠢的错误,我在 FETCH 之外 SET temp = 1;,因此在第一个游标值之后,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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 2019-06-14
    • 1970-01-01
    • 2015-05-20
    • 2023-03-07
    • 1970-01-01
    • 2021-08-14
    相关资源
    最近更新 更多