一尘不染

在存储过程中声明变量时出错?

sql

我是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;

好像还好 设置过程中的某些变量后,我是否不能声明更多变量?


阅读 140

收藏
2021-05-16

共1个答案

一尘不染

从手册页DECLARE语法

仅在BEGIN …
END复合语句内部允许使用DECLARE,并且必须在其开始处以及其他任何语句之前。声明必须遵循一定的顺序。游标声明必须出现在处理程序声明之前。变量和条件声明必须出现在游标或处理程序声明之前。

请注意,这些在mysql中称为“ 局部变量” 。它们与用户变量(带@符号前缀)不同,用户变量可以随您的语句一起使用,并且不需要DECLARE。

2021-05-16