我刚开始学习事务和存储过程,我正在努力让自己熟悉从结果集向变量赋值的不同方法。
可能导致 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 into
和 set
。
如果有任何帮助,我将不胜感激。
谢谢。
最佳答案
这有点棘手。只需将所有声明放在处理程序之前:
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/