MySQl 错误 #1064 存储过程 IF ELSE 带有多个 SELECT 语句
Posted
技术标签:
【中文标题】MySQl 错误 #1064 存储过程 IF ELSE 带有多个 SELECT 语句【英文标题】:MySQl Error #1064 Stored Procedure IF ELSE with multiple SELECT statements 【发布时间】:2013-04-07 03:32:30 【问题描述】:我在 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;
是的,我已经单独测试了具有不同限制的其他选择语句,它们也可以正常工作,除非在选择 LIMIT 4,1 时使用 2 或 3 作为 prefTimeRange。 prefTimeRange 的 2 和 3 只返回四个结果,所以如果 prefTimeRange 是 2 或 3,我将 -1 分配给 run5。
无论我是否这样做:prefTimeRange = 3
或这个:prefTimeRange = "3"
是的,我记得告诉 phpMyAdmin 正确的分隔符是 $$。
我错过了什么????
【问题讨论】:
您需要在开始创建程序之前更改分隔符...delimiter $$
检查您是否这样做了??
感谢 Meherzad 的建议,但正如我在帖子底部附近所说的那样,我记得这样做。
【参考方案1】:
已解决:事实证明,ELSE 和 IF 之间的空间需要删除!
【讨论】:
【参考方案2】:这是一个非常糟糕的 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 的 else 部分上方留下 EXTRA LINE。
【讨论】:
以上是关于MySQl 错误 #1064 存储过程 IF ELSE 带有多个 SELECT 语句的主要内容,如果未能解决你的问题,请参考以下文章
#1064 - MySQL 服务器版本在“END”错误附近使用正确的语法?