代码之家  ›  专栏  ›  技术社区  ›  nucky

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

  •  0
  • nucky  · 技术社区  · 6 年前

    我正在制定一个程序,该程序执行以下操作: 声明了一个游标后,我想遍历表中的所有条目,以查找给定句点覆盖了游标中的句点的条目。

    例子

    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);  
    

    错误代码如下:

    SQL语法有错误;检查手册 靠近“ctr”:=1, 设置“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 回复  |  直到 6 年前
        1
  •  1
  •   flyingfox    6 年前

    你需要添加 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;