为什么 DECLARE 在错误的位置? [MySQL Workbench]
Why is DECLARE in the wrong spot? [MySQL Workbench]
我一直在转动我的轮子试图弄清楚我错在哪里。我是 MySQL 的新手,所以它可能很简单。我正在创建一个存储过程来增加用户的游戏内货币。我尝试为过程声明一个变量,workbench 给我一个错误消息“在此位置无效,期待 END”。我在网上查过的所有东西都说要这样做。如果我将 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
引用它。此外,变量名与 table.
的实际列名冲突
最重要的是,我认为您不需要那么复杂的逻辑。似乎一个简单的 update
语句就可以满足您的需求。所以你的代码变成了一个单语句过程,像这样:
create procedure addcurrencybalance (p_user_id int, p_amount int)
update users
set currency = currency + p_amount
where user_id = p_user_id
;
不要对参数、声明的变量和列使用相同的名称,不要将用户定义的 (at) 变量与本地(声明的变量)混淆。您更正的代码是
delimiter $$
CREATE PROCEDURE p1(p_userID INT, p_amount INT)
BEGIN
DECLARE balance INT;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET balance = (SELECT currency FROM t WHERE user_id=P_userID);
SET p_amount = balance + p_amount;
UPDATE t
SET currency = p_amount
WHERE user_id = p_userID;
#SELECT currency FROM t WHERE user_id=p_userID;
END $$
@GMB 回答更好..
我一直在转动我的轮子试图弄清楚我错在哪里。我是 MySQL 的新手,所以它可能很简单。我正在创建一个存储过程来增加用户的游戏内货币。我尝试为过程声明一个变量,workbench 给我一个错误消息“在此位置无效,期待 END”。我在网上查过的所有东西都说要这样做。如果我将 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
引用它。此外,变量名与 table.
最重要的是,我认为您不需要那么复杂的逻辑。似乎一个简单的 update
语句就可以满足您的需求。所以你的代码变成了一个单语句过程,像这样:
create procedure addcurrencybalance (p_user_id int, p_amount int)
update users
set currency = currency + p_amount
where user_id = p_user_id
;
不要对参数、声明的变量和列使用相同的名称,不要将用户定义的 (at) 变量与本地(声明的变量)混淆。您更正的代码是
delimiter $$
CREATE PROCEDURE p1(p_userID INT, p_amount INT)
BEGIN
DECLARE balance INT;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET balance = (SELECT currency FROM t WHERE user_id=P_userID);
SET p_amount = balance + p_amount;
UPDATE t
SET currency = p_amount
WHERE user_id = p_userID;
#SELECT currency FROM t WHERE user_id=p_userID;
END $$
@GMB 回答更好..