首页 > 解决方案 > 为什么 DECLARE 在错误的位置?[MySQL 工作台]

问题描述

我一直在旋转我的轮子,试图找出我做错了什么。我是 MySQL 新手,所以它可能很简单。我正在创建一个存储过程来增加用户的游戏内货币。我尝试为过程声明一个变量,工作台给我一个错误,说“在这个位置无效,期待结束”。我在网上查到的所有东西都说要这样做。如果我将 DECLARE 移动到 SET TRANSACTION 上方的位置,我可以得到它,因此没有错误,但该过程不会改变货币价值。我相信这是因为没有声明变量,因此它没有任何地方可以存储起始余额,因此无法将金额添加到余额中。我确实看到一些文章提到没有放入分号,但我尝试更改它,但会产生不同的错误。任何帮助将非常感激。

CREATE DEFINER=`root`@`localhost` PROCEDURE `addCurrencyBalance`(userID INT, amount INT)
BEGIN

    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    DECLARE balance INT;
    SET balance = (SELECT currency 
    FROM users 
    WHERE user_id=@userID);
        SET @amount = balance + @amount;
        UPDATE users 
SET 
    currency = @amount
WHERE
    user_id = @userID;
    SELECT currency FROM users WHERE user_id=userID;
    
COMMIT;
END

标签: mysqlmysql-workbenchworkbench

解决方案


您正在混合用户变量和局部变量,这使代码变得混乱。例如userID,是函数的参数,但随后您使用@userID. 此外,变量名与表的实际列名冲突。

最重要的是,我认为您不需要那种复杂的逻辑。似乎一个简单的update语句可以满足您的要求。所以你的代码变成了一个单语句过程,就像这样:

create procedure addcurrencybalance (p_user_id int, p_amount int)
    update users
    set currency = currency + p_amount 
    where user_id = p_user_id
;

推荐阅读