mysql - 事务或变量声明错误

标签 mysql sql stored-procedures transactions syntax-error

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

可能导致 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 变量声明的错误是语法错误:意外的'var_CurcId'(标识符)

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

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

谢谢。

最佳答案

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

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 block 中,所有DECLARE 必须是第一条语句。通常处理程序在变量声明之后;然而,在测试之前我没有意识到这是必需的。

关于mysql - 事务或变量声明错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37499772/

相关文章:

sql-server - 如何从存储过程启动 SQL Server 作业?

php - 如何将文本文件插入到数据库表mysql

mysql - 左连接不返回 mysql 中左表中的所有行

php - 使用 PHP 在 MYSQL 中的 "Select"语句中使用 "Insert"

mysql - SQL查询水手

mysql - 从 MySQL 数据库中删除 blob

sql IN 语句始终为真

mysql - 使用 MySQL 存储过程进行多列搜索

PHP 准备 MySQL 查询来填充 HTML 表

mysql - 只有 else 条件是在插入或更新期间使用存储过程在 mysql 中执行