Таинственная синтаксическая ошибка при SET в MySQL Stored Proc - PullRequest
0 голосов
/ 20 сентября 2011

У меня есть простая таблица, которая имеет два столбца: столбец int с автоинкрементом, называемый id, и столбец даты, называемый start. Я пытаюсь написать хранимую процедуру, которая, учитывая значение, будет вычислять соответствующую запись, чтобы связать ее. Проблема в том, что я получаю синтаксическую ошибку, которая на самом деле не говорит мне, что происходит. Ошибка:

Код ошибки: 1064. У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'SET finalResult =андидат;

Вот код, который я использую для создания процедуры. Может кто-нибудь сказать, пожалуйста, что я делаю не так?

delimiter //
CREATE PROCEDURE FindGCLDate(IN targetDate DATE)
    BEGIN
        DECLARE candidate DATE;
        DECLARE finalResult DATE;
        DECLARE loopComplete BOOLEAN;
        DECLARE allDates CURSOR FOR SELECT * FROM gcl_dates;
        DECLARE CONTINUE HANDLER FOR NOT FOUND
            SET loopComplete = TRUE;

        OPEN allDates;

        myLoop : LOOP
            FETCH allDates INTO candidate;
            SELECT candidate;
            IF targetDate < candidate
                SET finalResult = candidate;  -- this is the offending line
                SET loopComplete = TRUE;
            END IF;

            IF loopComplete THEN
                CLOSE allDates;
                LEAVE myLoop;
            END IF;
        END LOOP myLoop;

        SELECT finalResult;
    END //

Я знаю, что с процедурой больше проблем - я не определил выходной параметр или ничего не возвратил. Но мне просто интересно, почему я получаю эту ошибку.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 20 сентября 2011

Вы пропускаете THEN в строке над ним:

IF targetDate < candidate

должно быть

IF targetDate < candidate THEN

Из точного руководства , синтаксисдля IF утверждение таково:

IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF

, где необязательные элементы, как обычно, отмечены скобками;вокруг THEN нет скобок, поэтому требуется.

0 голосов
/ 20 сентября 2011
delimiter //
CREATE PROCEDURE FindGCLDate(IN targetDate DATE)
    BEGIN
        DECLARE candidate DATE;
        DECLARE finalResult DATE;
        DECLARE loopComplete BOOLEAN;
        DECLARE allDates CURSOR FOR SELECT * FROM gcl_dates;
        DECLARE CONTINUE HANDLER FOR NOT FOUND
            SET loopComplete = TRUE;

        OPEN allDates;

        myLoop : LOOP
            FETCH allDates INTO candidate;
            SELECT candidate;
            IF targetDate < candidate THEN   -- You had missed THEN
                SET finalResult = candidate;  -- this is the offending line
                SET loopComplete = TRUE;
            END IF;

            IF loopComplete THEN
                CLOSE allDates;
                LEAVE myLoop;
            END IF;
        END LOOP myLoop;

        SELECT finalResult;
    END //

Вы пропустили ТО после заявления IF:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...