【问题标题】:Transaction or variable declaration error事务或变量声明错误
【发布时间】:2016-05-28 13:45:12
【问题描述】:

我刚开始学习事务和存储过程,我正在努力让自己熟悉将值从结果集分配给变量的不同方法。

什么可能导致DECLARE var_CurcId INT DEFAULT 0;上的错误

这是我到目前为止所做的。

CREATE DEFINER=`root`@`localhost` PROCEDURE `addCurriculumWithSchoolYear`(IN p_subjectName varchar(50), IN p_yrLevel varchar(30), IN p_desc TEXT, IN p_creator varchar(20))
BEGIN

    DECLARE hasError BOOL DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasError = 1;

    DECLARE var_CurcId INT DEFAULT 0; 
    DECLARE var_syStart INT DEFAULT 0;
    DECLARE var_syEnd INT DEFAULT 0;

        START TRANSACTION;

        -- 1 insert statement to curriculum table
            INSERT INTO curriculum(`name`,`yearLevel`,`description`,`creator`)
            VALUES(p_subjectName,p_yrLevel,p_desc,p_creator);
        -- 2 insert statement to schoolyearcurriculum table

            INSERT INTO schoolyearcurriculums(curriculumId,syStart,syEnd)
            VALUES(var_CurcId,var_syStart,var_syEnd);

        IF `hasError` THEN
            ROLLBACK; -- if error occurs to any of the insert, select statements above, undo it
        ELSE 
            COMMIT; -- if all insert, select statement is successful, execute.
            SELECT 'Successfully Inserted Information';
        END IF;
END;

var_CurcId 变量声明的错误是 Syntax error: unexpected 'var_CurcId' (identifier)

我是新手,所以希望你能帮助我。我仍在尝试不同的方法,例如使用:= 运算符和select intoset

如果有任何帮助,我将不胜感激。

谢谢。

【问题讨论】:

    标签: mysql sql stored-procedures transactions syntax-error


    【解决方案1】:

    这有点棘手。只需将所有声明放在处理程序之前:

    CREATE PROCEDURE `addCurriculumWithSchoolYear`(IN p_subjectName varchar(50), IN p_yrLevel varchar(30), IN p_desc TEXT, IN p_creator varchar(20))
    BEGIN  
        DECLARE hasError BOOL DEFAULT 0;
        DECLARE var_CurcId INT DEFAULT 0; 
        DECLARE var_syStart INT DEFAULT 0;
        DECLARE var_syEnd INT DEFAULT 0;
    
        DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET hasError = 1;
    
    END
    

    Here 是一个 SQL Fiddle。

    BEGIN/END 块中,所有DECLAREs 必须是第一个语句。通常处理程序在变量声明之后;然而,直到测试它,我才意识到这是必需的。

    【讨论】:

    • 谢谢。你解决了!我不知道 Handler 必须进行变量声明。我认为所有的 DECLARE 语句都可以放在任何地方。我很感激帮助。又一次增加了我的知识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    相关资源
    最近更新 更多