如何修复MariaDB存储过程中的Error #1064语法错误?
存储过程语法错误修正方案
错误原因
在MariaDB/MySQL的存储过程中,DECLARE仅用于声明不带@前缀的局部变量;带@前缀的是会话级用户变量,这类变量不需要通过DECLARE声明,直接赋值即可。原代码里的DECLARE @study_ID INT;违反了该语法规则,导致报错。
修正方案
有两种可行的修正方式:
方式1:使用会话用户变量(移除DECLARE声明)
直接去掉对@study_ID的DECLARE语句,保留会话变量的使用:
DELIMITER $$ CREATE PROCEDURE insert_priority_rows() BEGIN DECLARE max_heuristics INT DEFAULT 10; DECLARE heuristic_ID INT; DECLARE cur CURSOR FOR SELECT heuristicID FROM heuristics; DECLARE CONTINUE HANDLER FOR NOT FOUND SET heuristic_ID = 0; -- 直接赋值会话变量,无需提前声明 SELECT MAX(studyID) INTO @study_ID FROM study; OPEN cur; REPEAT FETCH cur INTO heuristic_ID; IF heuristic_ID = 0 THEN LEAVE; END IF; INSERT INTO heuristic_priority (studyID, heuristicID, h_priority) VALUES (@study_ID, heuristic_ID, 'm'); UNTIL heuristic_ID = 0 END REPEAT; CLOSE cur; END$$ DELIMITER ;
方式2:使用局部变量(移除@前缀)
推荐采用这种方式,局部变量仅在存储过程执行期间有效,更符合封装性:
DELIMITER $$ CREATE PROCEDURE insert_priority_rows() BEGIN DECLARE max_heuristics INT DEFAULT 10; DECLARE heuristic_ID INT; -- 声明局部变量,不带@前缀 DECLARE study_ID INT; DECLARE cur CURSOR FOR SELECT heuristicID FROM heuristics; DECLARE CONTINUE HANDLER FOR NOT FOUND SET heuristic_ID = 0; SELECT MAX(studyID) INTO study_ID FROM study; OPEN cur; REPEAT FETCH cur INTO heuristic_ID; IF heuristic_ID = 0 THEN LEAVE; END IF; INSERT INTO heuristic_priority (studyID, heuristicID, h_priority) VALUES (study_ID, heuristic_ID, 'm'); UNTIL heuristic_ID = 0 END REPEAT; CLOSE cur; END$$ DELIMITER ;
注:两种方式均能解决语法错误,方式2的局部变量不会污染会话环境,更适合存储过程场景。
内容的提问来源于stack exchange,提问作者learning Gatherer
相关产品推荐
相关产品推荐

