【问题标题】:MySQL Syntax Error - END IF lineMySQL 语法错误 - END IF 行
【发布时间】:2017-12-16 16:47:02
【问题描述】:

我尝试创建一个带有 if 语句的存储过程。 我复制自:https://dev.mysql.com/doc/refman/5.7/en/local-variable-scope.html

但我在 END IF 上得到以下错误; ''附近:

DROP PROCEDURE IF EXISTS `myProc`; 
CREATE DEFINER=`root`@`%` PROCEDURE `myProc`(
   IN in_userId int,
   IN in_projectId int
)
BEGIN
    DECLARE tmp_courseId int;
    DECLARE done TINYINT DEFAULT 0;
    DECLARE cursorProjectCourse CURSOR FOR SELECT CourseId FROM XC_PROJECT_COURSE where projectId = in_projectId ;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN cursorProjectCourse;

    read_loop: LOOP

        FETCH FROM cursorProjectCourse INTO tmp_courseId;

        IF done = 1 THEN LEAVE read_loop;

        END IF;

        SELECT tmp_courseId, in_userId; 
    END LOOP;
    CLOSE cursorProjectCourse;
END;

有人知道我在哪里犯了错误吗?

确切的错误信息:

SQL 错误 [1064] [42000]:您的 SQL 语法有错误;查看 与您的 MySQL 服务器版本相对应的手册 在第 19 行 SQL 错误 '' 附近使用的语法

MySQL 版本: 5.5.46

感谢您的帮助!

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    我找到了解决方案。 我必须在第一个语句中设置DELIMITER $$,在最后设置DELIMITER ;

    DELIMITER $$;
    DROP PROCEDURE IF EXISTS `myProc`; $$
    CREATE DEFINER=`root`@`%` PROCEDURE `myProc`(
       IN in_userId int,
       IN in_projectId int
    )
    BEGIN
        DECLARE tmp_courseId int;
        DECLARE done TINYINT DEFAULT 0;
        DECLARE cursorProjectCourse CURSOR FOR SELECT CourseId FROM XC_PROJECT_COURSE where projectId = in_projectId ;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    
        OPEN cursorProjectCourse;
    
        read_loop: LOOP
    
            FETCH FROM cursorProjectCourse INTO tmp_courseId;
    
            IF done = 1 THEN LEAVE read_loop;
    
            END IF;
    
            SELECT tmp_courseId, in_userId; 
        END LOOP;
        CLOSE cursorProjectCourse;
    END;$$
    DELIMITER ;
    

    将关键字设置在行首位置很重要。如果第一个位置有空格,则会抛出上述错误。

    【讨论】:

      【解决方案2】:

      你在结束循环时缺少循环标签。改成下面

      read_loop: LOOP
          FETCH FROM cursorProjectCourse INTO tmp_courseId;
          IF done = 1 THEN 
          LEAVE read_loop;
          END IF;
      END LOOP read_loop;
          SELECT tmp_courseId, in_userId; 
      

      【讨论】:

      • 我还尝试了其他解决方案来定位 END IF 语句(如同一行等),但它仍然无法正常工作。
      • @NorbertKoch,忽略以前的答案...立即查看编辑。希望对您有所帮助。
      • 谢谢。我在上面找到了解决方案。在此之后,它适用于两种语法:END LOOP;END LOOP read_loop;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      相关资源
      最近更新 更多