【问题标题】:MySQl Error #1064 Stored Procedure IF ELSE with multiple SELECT statementsMySQl 错误 #1064 存储过程 IF ELSE 带有多个 SELECT 语句
【发布时间】: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 的建议,但正如我在帖子底部附近所说的那样,我记得这样做。

标签: mysql select stored-procedures phpmyadmin


【解决方案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。

    【讨论】:

      猜你喜欢
      • 2018-05-23
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      相关资源
      最近更新 更多