2013-04-15 180 views
2

我在GoDaddy上通过phyMyAdmin使用MySQL。然而MySQl错误#1064存储过程IF ELSE与多个SELECT语句

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

,当我试图创建下面的存储过程,我得到以下错误:我可以执行该语句和一个整数值没有任何问题返回

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 '' at line 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只返回四个结果,所以我分配-1到run5如果prefTimeRange为2或3

我得到同样的确切的错误是否我这样做:​​或本:prefTimeRange = "3"

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

我在想什么?

+0

您需要在开始创建过程之前更改分隔符...''delimiter $$'检查您是否已经完成了此操作? – Meherzad

+0

感谢Meherzad的建议,但正如我在帖子底部所述,我记得要这样做。 – AstroLovesCodey

回答

0

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

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。