mysql - 为什么 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
解决方案
您正在混合用户变量和局部变量,这使代码变得混乱。例如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
;
推荐阅读
- kubernetes - 仅将 POST 重定向到 nginx 入口
- c# - 如何在仅使用 3 个 for 循环时优化此问题?
- python - 如何在不获取 ValueError 的情况下访问类的根属性
- ado - 如何禁用 ODBC 连接向导
- r - 从 r 数据帧生成加权矩阵
- sql - 如何在只有所有子查询都为真的情况下返回匹配的列值
- java - 将给定数组的所有子数组存储在 ArrayList 的 ArrayList 中,并显示 ArrayList 的内容
- filtering - 电机对 IMU 的影响
- ios - 使用 ios-charts 为 LineChartData 标签设置背景颜色和空间/填充
- python - Python: How can I get lower 95% confidence interval using Kaplan-Meier estimate for survival curve estimate