【问题标题】:MySql syntax error on procedure parameter过程参数上的MySql语法错误
【发布时间】:2018-05-22 23:19:40
【问题描述】:

我正在尝试编写一个简单的过程,但在第一个参数处遇到语法错误。尽我所能告诉我我正确地遵循了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 上的选项将分隔符更改为 /。

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

【问题讨论】:

  • 删除@

标签: mysql stored-procedures phpmyadmin


【解决方案1】:

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

在 MySQL 语法中,过程参数没有符号。

通常还声明参数INOUTINOUT

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

具有@ 符号的MySQL 变量是会话变量

另见:

【讨论】:

    【解决方案2】:

    在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 2022-01-12
      • 2012-04-12
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多