Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL存储过程中设置的神秘语法错误_Mysql_Stored Procedures - Fatal编程技术网

MySQL存储过程中设置的神秘语法错误

MySQL存储过程中设置的神秘语法错误,mysql,stored-procedures,Mysql,Stored Procedures,我有一个简单的表,它有两列:一个名为id的自动递增int列和一个名为start的日期列。我正在尝试编写一个存储过程,给定一个值,它将计算将其绑定到的适当记录。问题是我得到了一个语法错误,它不能真正告诉我发生了什么。错误是: 错误代码:1064。您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解可在“SET finalResult=candidate”附近使用的正确语法 下面是我用来创建过程的代码。谁能告诉我我做错了什么 delimiter // CREATE PROCEDUR

我有一个简单的表,它有两列:一个名为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参数或返回任何东西。但我只是想知道为什么我会犯这个错误

谢谢

您缺少一个,然后在上面的一行:

IF targetDate < candidate
如往常一样,可选物品用括号标记;THEN周围没有括号,因此它是必需的。

在它上面的行中缺少一个THEN:

IF targetDate < 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 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 //
如往常一样,可选物品用括号标记;没有括号,所以它是必需的

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之后的语句:


您错过了IF之后的语句:

为什么需要编写一个存储过程来实现这一点?使用单个SELECT执行相同的操作似乎相当简单,除非我误解了什么?为什么需要编写存储过程来执行此操作?用一个选择来做同样的事情似乎相当简单,除非我误解了什么?啊哈,我以为这会很简单。谢谢啊哈,我还以为会很简单呢。谢谢