MySQl错误#1064存储过程如果ELSE有多个SELECT语句

时间:2013-04-15 05:12:37

标签: mysql select stored-procedures phpmyadmin

我在GoDaddy上通过phyMyAdmin使用MySQL。我可以执行此语句,并返回一个整数值,没有任何问题:

SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = 2) LIMIT 0,1;

但是,当我尝试创建以下存储过程时,出现以下错误:

  

1064 - 您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在第25行

附近使用正确的语法
DROP PROCEDURE IF EXISTS `spGetPreferredRunNumbers`$$
CREATE PROCEDURE `spGetPreferredRunNumbers`(IN prefTimeRange INT(4), INOUT run1 INT(4), INOUT run2 INT(4), INOUT run3 INT(4), INOUT run4 INT(4), INOUT run5 INT(4))
BEGIN
IF (prefTimeRange = 2) THEN BEGIN
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 0,1  INTO run1;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 1,1  INTO run2;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 2,1  INTO run3;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 3,1  INTO run4;
SET run5 = -1;
END;
ELSE IF (prefTimeRange = 3) THEN BEGIN
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 0,1  INTO run1;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 1,1  INTO run2;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 2,1  INTO run3;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 3,1  INTO run4;
SET run5 = -1;
END;
ELSE BEGIN
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 0,1  INTO run1;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 1,1  INTO run2;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 2,1  INTO run3;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 3,1  INTO run4;
SELECT DISTINCT `runNumber` FROM RideSlot WHERE (timeRange = prefTimeRange) LIMIT 4,1  INTO run5;
END;
END IF;
END$$
DELIMITER;

是的,我已经单独测试了具有不同限制的其他select语句,它们也可以正常工作,除非在选择LIMIT 4,1时使用2或3作为prefTimeRange。 prefTimeRange的2& 3只返回4个结果,所以如果prefTimeRange是2或3,我将-1分配给run5。

无论我是否这样做,我都会得到同样的错误:prefTimeRange = 3或者:prefTimeRange = "3"

是的,我记得告诉phpMyAdmin正确的分隔符是$$。

我错过了什么?

2 个答案:

答案 0 :(得分:0)

解决:事实证明ELSE和IF之间的空间需要删除!

答案 1 :(得分:0)

这是一个非常糟糕的mysql问题,没有正确记录的地方。 MYSQL存储过程 - 如果在ELSE之前留下额外的行或空格,则else部分不执行任何操作。

IF <your condition> then
<do this code>
                   <-- extra empty line
ELSE
<this always executes no matter what is in IF statement>

在上面的示例中 - 如果在ELSE上面留空行,则else部分始终执行。不要将额外线路放在if-else的其他部分之上。