我有一个简单的表,它有两列:一个名为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参数或返回任何内容。但我只是想知道为什么我会收到这个错误。
谢谢!
答案 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声明之后错过了那个:)