带有Cursor的小过程,用于表中的自动创建行(MYSQL)

时间:2017-04-12 12:30:06

标签: mysql

我创建了一个每月执行一次的事件。这里有三张桌子很重要,Cuota(费用),Alumno(studient)和CuotaxAlumno(每个学生的费用)。

我的目标是每月一次在表Cuota(费用)中创建一行,然后使用该费用为每个学生创建一个支付行(在表CuotaxAlumno中)。

我在第11行的第二条FETCH线路中遇到语法错误,但我找不到问题。我将非常感谢你的帮助。

现在正在工作。 CODE UPDATED 13-04-2017谢谢!

DELIMITER $$

CREATE PROCEDURE crearCuotas()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE referenciaMonto INT;
    DECLARE referenciaAlumno INT;
    DECLARE referenciaCuota INT;
    DECLARE fecha DATE;
    DECLARE cursorAlumno CURSOR FOR SELECT idAlumno FROM alumno WHERE idEstado=1;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    SET referenciaMonto = (SELECT idMontoCuota FROM montocuota ORDER BY idMontoCuota DESC LIMIT 1);
    SET fecha = CURDATE();
    INSERT INTO cuota (idMontoCuota, fecha) VALUES(referenciaMonto, fecha);
    SET referenciaCuota = (SELECT idCuota FROM cuota ORDER BY idCuota DESC LIMIT 1);

    OPEN cursorAlumno;

    fetch_loop: LOOP
        FETCH cursorAlumno INTO referenciaAlumno;
        IF done THEN
            LEAVE fetch_loop;
        END IF;
        INSERT INTO cuotaxalumno(idAlumno, idCuota, idEstado) VALUES(referenciaAlumno, referenciaCuota, 5);
    END LOOP;

    CLOSE cursorAlumno;
END;

DELIMITER ;

1 个答案:

答案 0 :(得分:0)

您需要添加循环标签:

CREATE PROCEDURE crearCuotas()
BEGIN
  /* yada */
  OPEN cursorAlumno;

  fetch_loop: LOOP
      FETCH cursorAlumno INTO referenciaAlumno;
      IF done THEN
          LEAVE fetch_loop;
      END IF;
      INSERT INTO cuotaxalumno (idAlumno, idCuota, idEstado) 
             VALUES (referenciaAlumno, referenciaCuota, 5);
  END LOOP;

  CLOSE cursorAlumno;
END;

这是因为虽然创建循环不需要标签,it is required for the leave statement.