我是SQL和存储过程的新手。我试图设置一些变量以便稍后在事务中使用,同时还要在异常上设置回滚变量,但是我无法做到这一点。
我不知道错误在哪里,因为当我在how_many之后切换部分时_rollback,错误发生了变化。
how_many
_rollback
我在这里声明变量的方式有什么问题?
DELIMITER $$ DROP PROCEDURE IF EXISTS `do_thing` $$ CREATE PROCEDURE `do_thing`() BEGIN DECLARE how_many INT; SELECT COUNT(*) FROM things INTO how_many; -- Prepare roleback. DECLARE `_rollback` BOOL DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1; -- Start transaction. START TRANSACTION; -- Do all the things. IF `_rollback` THEN ROLLBACK; ELSE COMMIT; END IF; END $$ DELIMITER ;
编辑:
当我声明这样的变量时:
DECLARE how_many INT; -- Prepare roleback. DECLARE `_rollback` BOOL DEFAULT 0; DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1; SELECT COUNT(*) FROM tiers INTO how_many;
好像还好 设置过程中的某些变量后,我是否不能声明更多变量?
从手册页DECLARE语法:
仅在BEGIN … END复合语句内部允许使用DECLARE,并且必须在其开始处以及其他任何语句之前。声明必须遵循一定的顺序。游标声明必须出现在处理程序声明之前。变量和条件声明必须出现在游标或处理程序声明之前。
请注意,这些在mysql中称为“ 局部变量” 。它们与用户变量(带@符号前缀)不同,用户变量可以随您的语句一起使用,并且不需要DECLARE。
@