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 语句的主要内容,如果未能解决你的问题,请参考以下文章

Mysql创建存储过程时出现ERROR 1064错误

MySQL 在存储过程中的情况:错误代码:1064

mysql phpmyadmin 中的存储过程 #1064

#1064 - MySQL 服务器版本在“END”错误附近使用正确的语法?

如何使用 phpmyadmin 在存储过程中创建一段时间,错误 #1064

带有游标的 MySQL 存储过程