我正在创建一个交换网站,并且确实需要进行交易。首先,进行选择并查找一些数据,然后根据给出的结果进行一些更新和插入。
我不会发布完整的查询,因为它可能非常难以阅读,因此我创建了一个新查询来指出问题所在。
表日志
CREATE TABLE `log` (
`num_rows` int(10) unsigned NOT NULL,
`new_value` int(10) unsigned NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
存储过程
DROP PROCEDURE IF EXISTS `test`//
CREATE PROCEDURE `test` (IN var1 BIGINT)
BEGIN
DECLARE result INT;
DECLARE num_rows INT;
DECLARE cur1 CURSOR FOR
SELECT @var1 := @var1 +1 AS result;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
START TRANSACTION;
OPEN cur1;
SELECT FOUND_ROWS() into num_rows;
INSERT INTO log (num_rows,new_value) VALUES (num_rows,var1);
CLOSE cur1;
COMMIT;
END//
当我尝试时
CALL test(1);
我将 1 作为 var1 参数传递。所以在 cur1 中,该值应该增加。然后使用新值将新行插入到日志中。看起来 := 赋值不起作用。
我真的变了
SELECT @var1 := @var1 +1 AS result;
为此
SELECT var1 := var1 +1 AS result;
并在“:= var1 +1”上收到错误
最佳答案
您的测试查询混淆了您实际上正在做的任何事情,以至于实际上不可能查明根本问题。您有一个 CONTINUE HANDLER 设置一个变量(“done”),该变量不仅没有经过测试(以打破也不存在的循环),甚至没有定义,因此编写的代码太模糊(并且,社区要求代码示例有效 - 产生错误的结果不会使其根据定义无效,但不可运行则无效,并且此代码不应与未声明的变量一起使用)。
想必您知道var1
是程序变量,而@var1
是用户定义变量,这意味着两者完全无关。我从未见过在带有 :=
赋值黑客的查询中使用程序变量,因此这可能是无效的(如果不是,则有意义,因为这两种类型变量的行为可能非常不同)。
如果问题这么简单,那么:
SET @var1 = var1;
...在过程的适当早期部分,并在查询中使用用户定义的变量@var1
。
虽然这似乎是一件奇怪的事情,但这并不是唯一可能需要这样的事情(将程序变量复制到用户定义的变量中)的情况......准备好的语句只能使用用户定义的变量,也是。
关于mysql - 游标上的存储过程变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20811146/