我是SQL和存储过程的新手。我正在尝试设置一些变量以便稍后在事务中使用,同时还在异常上设置回滚变量,但我无法做到这一点。
我不知道错误的位置,因为当我在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;
似乎很好。在设置过程中的某些变量后,我不允许声明更多变量吗?
答案 0 :(得分:0)
来自手册页DECLARE Syntax:
仅允许在BEGIN ... END复合语句中使用DECLARE 并且必须在任何其他陈述之前开始。 声明必须遵循一定的顺序。游标声明必须出现在处理程序声明之前。变量和条件 声明必须出现在游标或处理程序声明之前。
请注意,这些在mysql中称为局部变量。它们与用户变量(带有@
符号前缀)不同,后者可以与您的语句一起使用,也不需要声明。
答案 1 :(得分:0)
DECLARE
语句仅在BEGIN
后允许,如果您尝试添加另一个DECLARE
,则会显示错误。
在所有SELECT COUNT(*) FROM things INTO how_many;
行之后移动DECLARE
行。
DELIMITER $$
DROP PROCEDURE IF EXISTS `do_thing` $$
CREATE PROCEDURE `do_thing`()
BEGIN
DECLARE how_many INT;
-- Prepare roleback.
DECLARE `_rollback` BOOL DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;
-- Start transaction.
START TRANSACTION;
SELECT COUNT(*) FROM things INTO how_many;
-- Do all the things.
IF `_rollback` THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END $$
DELIMITER ;