我是 InnoDB 新手,从事务开始。我花了 24 小时试图让它发挥作用。 我正在创建一个交换网站,并且确实需要进行交易。首先,进行选择并查找一些数据,然后根据给出的结果进行一些更新和插入。
我不会发布完整的查询,因为它可能非常难以阅读,因此我创建了一个新查询来指出问题所在。
表日志
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 done INT DEFAULT 0;
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);
read_loop:
LOOP
FETCH cur1 INTO result;
IF done = 1 THEN
LEAVE read_loop;
END IF;
END LOOP read_loop;
CLOSE cur1;
COMMIT;
END//
当我尝试时
CALL test(1);
我将 1 作为 var1 参数传递。所以在 cur1 中,该值应该增加。然后使用新值将新行插入到日志中。看起来 := 分配不起作用。
我真的变了
SELECT @var1 := @var1 +1 AS result;
为此
SELECT var1 := var1 +1 AS result;
并在“:= var1 +1”上收到错误
最佳答案
我知道问题的代码是存储过程实际代码的抽象,因此不太明白您需要做什么,但是,这样的代码可能会有所帮助。
/* Procedure structure for procedure `test` */
/*!50003 DROP PROCEDURE IF EXISTS `test` */;
DELIMITER $$
CREATE PROCEDURE `test`(IN `var1` BIGINT)
BEGIN
DECLARE `done` TINYINT(1) DEFAULT 0;
DECLARE `result` BIGINT;
DECLARE `_num_rows` INT;
DECLARE `cur1` CURSOR FOR
SELECT SQL_CALC_FOUND_ROWS @`var1` := `var1` + 1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET `done` := 1;
START TRANSACTION;
OPEN `cur1`;
SET `var1` := @`var1`;
SELECT FOUND_ROWS() INTO `_num_rows`;
INSERT INTO `log` (`num_rows`, `new_value`) VALUES (`_num_rows`, `var1`);
`read_loop`: LOOP
FETCH `cur1` INTO `result`;
IF (`done`) THEN
LEAVE `read_loop`;
END IF;
END LOOP `read_loop`;
CLOSE `cur1`;
COMMIT;
END$$
DELIMITER ;
指出 9.4. User-Defined Variables 之间的区别很重要和常规参数13.1.15. CREATE PROCEDURE and CREATE FUNCTION Syntax ,是不同的变量。
关于Mysql - 如何在指针上使用用户定义的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20803146/