2013-04-15 6 views
2

Я использую MySQL через phyMyAdmin на GoDaddy. Я могу выполнить эту инструкцию и одно целое значение возвращается без каких-либо проблем:Ошибка 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; 

Да , Я тестировал другие команды выбора с разными ограничениями отдельно, и они отлично работают, за исключением случаев, когда вы используете 2 или 3 для prefTimeRange при выборе LIMIT 4,1. PrefTimeRange 2-х & 3 возвращают только четыре результата, поэтому я задаю -1 до run5 если prefTimeRange является 2 или 3.

я получаю такую ​​же точную ошибку или не делать, я это: prefTimeRange = 3 или это: prefTimeRange = "3"

Да, я помню, чтобы сообщить phpMyAdmin, что правильный разделитель равен $$.

Что мне не хватает ????

+0

Вам нужно изменить разделитель перед началом процедуры создания ... 'delimiter $$' проверить, сделали ли вы это? – Meherzad

+0

Спасибо за предложение Мехерзада, но, как я сказал в нижней части сообщения, я помню, чтобы это сделать. – 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.