在存储过程中声明变量的错误?

时间:2016-06-19 04:06:35

标签: mysql sql stored-procedures

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

似乎很好。在设置过程中的某些变量后,我不允许声明更多变量吗?

2 个答案:

答案 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 ;