MySQL存储过程中SET处的神秘语法错误

时间:2011-09-20 06:21:22

标签: mysql stored-procedures

我有一个简单的表,它有两列:一个名为id的自动增量int列和一个名为start的日期列。我正在尝试编写一个存储过程,给定一个值,将计算相应的记录以将其绑定。问题是我收到的语法错误并没有真正告诉我发生了什么。错误是:

  

错误代码:1064。您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在'SET finalResult = candidate;

附近使用正确的语法

这是我用来创建程序的代码。谁能告诉我我做错了什么?

delimiter //
CREATE PROCEDURE FindGCLDate(IN targetDate DATE)
    BEGIN
        DECLARE candidate DATE;
        DECLARE finalResult DATE;
        DECLARE loopComplete BOOLEAN;
        DECLARE allDates CURSOR FOR SELECT * FROM gcl_dates;
        DECLARE CONTINUE HANDLER FOR NOT FOUND
            SET loopComplete = TRUE;

        OPEN allDates;

        myLoop : LOOP
            FETCH allDates INTO candidate;
            SELECT candidate;
            IF targetDate < candidate
                SET finalResult = candidate;  -- this is the offending line
                SET loopComplete = TRUE;
            END IF;

            IF loopComplete THEN
                CLOSE allDates;
                LEAVE myLoop;
            END IF;
        END LOOP myLoop;

        SELECT finalResult;
    END //

我知道程序有更多错误 - 我还没有定义out参数或返回任何内容。但我只是想知道为什么我会收到这个错误。

谢谢!

2 个答案:

答案 0 :(得分:3)

您在其上方的行上错过了THEN

IF targetDate < candidate

应该是

IF targetDate < candidate THEN

fine manual开始,IF语句的语法是:

IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF

其中可选的东西像往常一样用括号标记; <{1}}周围没有括号,因此需要它。

答案 1 :(得分:0)

delimiter //
CREATE PROCEDURE FindGCLDate(IN targetDate DATE)
    BEGIN
        DECLARE candidate DATE;
        DECLARE finalResult DATE;
        DECLARE loopComplete BOOLEAN;
        DECLARE allDates CURSOR FOR SELECT * FROM gcl_dates;
        DECLARE CONTINUE HANDLER FOR NOT FOUND
            SET loopComplete = TRUE;

        OPEN allDates;

        myLoop : LOOP
            FETCH allDates INTO candidate;
            SELECT candidate;
            IF targetDate < candidate THEN   -- You had missed THEN
                SET finalResult = candidate;  -- this is the offending line
                SET loopComplete = TRUE;
            END IF;

            IF loopComplete THEN
                CLOSE allDates;
                LEAVE myLoop;
            END IF;
        END LOOP myLoop;

        SELECT finalResult;
    END //

你在IF声明之后错过了那个:)