我在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正确的分隔符是$$。
我错过了什么?
答案 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的其他部分之上。