Ошибка синтаксиса SQL при создании хранимой процедуры в MySQL - PullRequest
7 голосов
/ 12 марта 2009

Мне трудно найти ошибку при попытке создать хранимую процедуру в mysql.

Если я запускаю каждую строку процедуры независимо, все работает просто отлично.

CREATE PROCEDURE cms_proc_add_child 
(
    param_parent_id INT, param_name CHAR(255),
    param_content_type CHAR(255)
)
BEGIN
    SELECT @child_left := rgt FROM cms_tree WHERE id = param_parent_id;
    UPDATE cms_tree SET rgt = rgt+2 WHERE rgt >= @child_left;
    UPDATE cms_tree SET lft = lft+2 WHERE lft >= @child_left;
    INSERT INTO cms_tree (name, lft, rgt, content_type) VALUES 
    (
        param_name,
        @child_left,
        @child_left+1,
        param_content_type
    );
END

Я получаю следующую (полезную) ошибку:

ОШИБКА 1064 (42000): у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '' в строке 3

Я просто не знаю, с чего начать отладку, так как каждая из этих строк верна.

У вас есть какие-нибудь советы?

Ответы [ 3 ]

23 голосов
/ 12 марта 2009

Поскольку строка 3 содержит первое ;, возможно, у вас есть проблема с разделителями.

См. http://dev.mysql.com/doc/refman/5.0/en/stored-programs-defining.html

DELIMITER //
CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
    SET @x = 0;
    REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END//
DELIMITER ;
1 голос
/ 02 апреля 2009

Спасибо, около '' в строке 3 была моя проблема, и оператор разделителя решил ее! Я всегда хочу, чтобы вещи имели смысл, и это делает. Как '' указывает, что это в конце процедуры, но оператор END не был найден, таким образом, синтаксическая ошибка. И я удивлялся, почему я продолжал видеть много людей, использующих оператор разделителя. Я вижу свет!

1 голос
/ 12 марта 2009

Вы никогда не объявляете свою переменную @child_left.

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