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

b4qexyjb  于 2023-02-28  发布在  Mysql
关注(0)|答案(4)|浏览(126)

当试图在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行""附近使用的正确语法
我只是不知道从哪里开始调试,因为这些行中的每一行都是正确的。
你有什么建议吗?

uidvcgyl

uidvcgyl1#

由于第3行包含第一个;,可能您的分隔符有问题。
参见http://dev.mysql.com/doc/refman/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 ;
6bc51xsx

6bc51xsx2#

谢谢,第3行*a附近的a是我的问题,分隔符语句修复了它!我总是希望事情有意义,这确实做到了。因为''指示它在过程的结尾,但没有找到END语句,因此语法错误。我想知道为什么我一直看到很多人使用分隔符语句。我看到了光明!

gajydyqb

gajydyqb3#

永远不要声明@child_left变量。

o7jaxewo

o7jaxewo4#

如果你有一堆程序不能同时运行,但可以单独成功运行的问题,尝试用Go命令将它们分开。
例如:

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

--ii)
CREATE PROCEDURE B
AS
BEGIN
END;

相关问题