mysql - MySQL 存储过程中 SET 出现神秘语法错误

标签 mysql stored-procedures

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

Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '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 //

我知道该过程还有更多错误——我还没有定义输出参数或返回任何内容。但我只是想知道为什么我会收到此错误。

谢谢!

最佳答案

上面一行缺少 THEN:

IF targetDate < candidate

应该是

IF targetDate < candidate THEN

来自fine manualIF 语句的语法如下:

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

其中可选的内容像往常一样用括号标记; THEN 周围没有括号,因此这是必需的。

关于mysql - MySQL 存储过程中 SET 出现神秘语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7480937/

相关文章:

sql-server - 验证 SQL Server 存储过程中的日期参数

sql-server - 使用传递参数 Access 调用存储过程

下拉菜单中的 PHP 存储和显示选项

mysql - 如何查看拥有相同授权的所有用户

php - 来自 php/mysql 数据库的实时日期时间倒计时问题

mysql - 根据另一个表中的 ID 和日期过滤 bigquery 表

linq-to-sql - 返回表的 SQL Server 2008 函数是否像存储过程一样得到优化?

mysql - 程序限制

mysql - 具有多个条件的一对多关系的联合

mysql - 如何在 where 子句中使用 select 中的变量