过程参数的MySql语法错误

时间:2017-12-08 17:02:54

标签: mysql stored-procedures phpmyadmin

我正在尝试编写一个简单的过程,但在第一个参数遇到语法错误。我可以告诉我正确遵循CREATE PROCEDURE的语法。

我只能使用phpMyAdmin访问我的数据库。这是我正在尝试运行的创建脚本:

DROP PROCEDURE IF EXISTS product_index_swap/
CREATE PROCEDURE product_index_swap (@id INT, @oldIndex INT, @newIndex INT)
BEGIN
    DECLARE @swapID;
    SET @swapID = (SELECT `id` FROM `product` WHERE `order_index` = @newIndex LIMIT 1);
    UPDATE `products` SET `order_index` = (CASE WHEN `id` = @id THEN @newIndex
                                                WHEN `id` = @swapID THEN @oldIndex END)
    WHERE `id` IN (@id, @swapID);
END

我正在使用phpMyAdmin上的选项将分隔符更改为/.

我收到语法错误“near'@id INT, @oldIndex INT....”。我以为我可能会遇到更多的分隔符错误,因为我不完全清楚它们的范围。我相信如果这是问题,那么当它无法理解分号时,错误就会出现在程序中的新行上,而不是参数声明。

2 个答案:

答案 0 :(得分:1)

您正在使用Microsoft SQL Server约定,在所有参数和局部变量之前放置@。 MySQL没有这样做。

在MySQL语法中,过程参数没有任何标记。

参数通常也会声明为INOUTINOUT

CREATE PROCEDURE product_index_swap (IN id INT, IN oldIndex INT, IN newIndex INT)
BEGIN
    DECLARE swapID;
    ...

具有@ sigil的MySQL变量是会话变量

另见:

答案 1 :(得分:0)

在MySQL中,@ var变量是会话级变量。

使用不带@的常规变量,并确保没有与列名冲突:

CREATE PROCEDURE product_index_swap (in_id INT, in_oldIndex INT, in_newIndex INT)
BEGIN
    DECLARE v_swapID int;

    SELECT id into v_swapID
    FROM product 
    WHERE order_index = in_newIndex 
    LIMIT 1;

    UPDATE products
    SET order_index = CASE WHEN id = in_id THEN in_newIndex
                           WHEN id = v_swapID THEN in_oldIndex 
                      END
    WHERE id IN (in_id, v_swapID);
END