在MySQL中创建存储过程时出现SQL语法错误

时间:2009-03-12 15:14:07

标签: mysql stored-procedures

尝试在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行的''附近使用正确的语法

我只是不知道从哪里开始调试,因为这些行中的每一行都是正确的。

你有任何提示吗?

4 个答案:

答案 0 :(得分:23)

由于第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 :(得分:1)

你永远不会声明你的@child_left变量。

答案 2 :(得分:1)

谢谢,<3> 附近的 是我的问题,分隔符语句修复了它!我总是希望事情有意义,这样做。由于''表示它在过程结束时,但没有找到END语句因此语法错误。我想知道为什么我一直看到很多人使用分隔符语句。我看到了光!

答案 3 :(得分:0)

如果您遇到一堆不能同时运行但可以单独成功运行的程序的问题,请尝试使用 Go 命令将它们分开。

例如:

--i)
CREATE PROCEDURE A
AS
BEGIN
END;
GO 

--ii)
CREATE PROCEDURE B
AS
BEGIN
END;