MySQL使用If条件在While循环中设置变量

时间:2018-09-28 10:16:11

标签: mysql

我正在执行以下操作: 声明了游标后,我要遍历表的所有条目以查找给定时间段覆盖了游标中的那个条目。

示例:一个学生A从日期3到日期6在x年级上学。让我们找出所有至少和他一起学习过同一课程的人。

while循环将应用于同一张表。但我想找出是否至少有一个条目。因此,如果出现第一个条目,则while循环应停止。

示例:学生B可能和A上过同一堂课。但是一年来他已经上了另一堂课。例如。

这是我的问题。我有两个变量要设置,但出现语法错误。

DELIMITER $$
DROP PROCEDURE IF EXISTS coworkers$$

CREATE PROCEDURE coworkers(
IN gus INT, 
IN rus INT,
OUT gto INT 

)
BEGIN
    DECLARE recCID INT;
    DECLARE recSDT DATE;
    DECLARE recEDT DATE;
    DECLARE done INT DEFAULT FALSE;

    DECLARE ctr INT;



    DECLARE cwrk CURSOR FOR
        SELECT comp_id, start_date, end_date FROM skill_cv_test WHERE usr_id = rus;
    DECLARE CONTINUE HANDLER 
        FOR NOT FOUND
        SET done = TRUE;

    OPEN cwrk;
    SET ctr = 0;
    loop_cwrk: WHILE(ctr<1) DO 

        FETCH cwrk INTO recCID, recSDT, recEDT;

        IF EXISTS
        (SELECT *
        FROM skill_cv_test AS m
        WHERE m.usr_Id = gus AND m.usr_id != rus AND (m.start_date < recSDT OR m.end_date <= recEDT) AND m.comp_id = recCID)
        THEN
        SET ctr = 1,
        SET gto = 1;


        IF done THEN
            LEAVE loop_cwrk;
        END IF;



    END WHILE loop_cwrk;
    CLOSE cwrk;

end $$
delimiter ;
CALL coworkers(2,1,@gto);  

我尝试了THEN SET ...部分的不同格式,这就是问题所在。 这是错误代码:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本以使用正确的语法   靠近``ctr'':= 1,           SET'gto'; = 1;

在这里您可以看到我尝试过的其他功能。可能这是完全错误的方法。

顺便说一句:循环中的Select只是占位符,可以使整个过程正常工作。

但是现在,我在做什么错了?

谢谢。

解决方案

DELIMITER $$
DROP PROCEDURE IF EXISTS coworkers$$

CREATE PROCEDURE coworkers(
IN gus INT, 
IN rus INT,
OUT gto INT 

)
BEGIN
    DECLARE recCID INT;
    DECLARE recSDT DATE;
    DECLARE recEDT DATE;
    DECLARE done INT DEFAULT FALSE;

    DECLARE ctr INT;



    DECLARE cwrk CURSOR FOR
        SELECT comp_id, start_date, end_date FROM skill_cv_test WHERE usr_id = rus;
    DECLARE CONTINUE HANDLER 
        FOR NOT FOUND
        SET done = TRUE;

    OPEN cwrk;
    SET ctr = 0;
    loop_cwrk: WHILE(ctr<1) DO 

        FETCH cwrk INTO recCID, recSDT, recEDT;

        IF EXISTS
           (SELECT *
            FROM skill_cv_test AS m
              WHERE m.usr_Id = gus AND m.usr_id != rus AND (m.start_date < recSDT 
             OR m.end_date <= recEDT) AND m.comp_id = recCID)
          THEN
            SET ctr = 1;
            SET gto = 1;
        END IF;


        IF done THEN
            LEAVE loop_cwrk;
        END IF;



    END WHILE loop_cwrk;
    CLOSE cwrk;

end $$
delimiter ;
CALL coworkers(2,1,@gto); 

1 个答案:

答案 0 :(得分:1)

您需要为第一个END IF添加IF

    IF EXISTS
       (SELECT *
        FROM skill_cv_test AS m
          WHERE m.usr_Id = gus AND m.usr_id != rus AND (m.start_date < recSDT 
         OR m.end_date <= recEDT) AND m.comp_id = recCID)
      THEN
        SET ctr = 1;
        SET gto = 1;
    END IF; -- Add END IF here


    IF done THEN
        LEAVE loop_cwrk;
    END IF;