MySQL 8.0.25存储过程编译报ERROR 1064(42000)求助
MySQL存储过程编译报错ERROR 1064(42000)的排查与修复
问题描述
编译以下存储过程时触发ERROR 1064(42000)语法错误,报错提示:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 23
MySQL版本:8.0.25-commercial
原存储过程代码:
DELIMITER | CREATE PROCEDURE LyrisDbcleanup(OUT p_error_code INT, OUT p_error_msg VARCHAR(250)) BEGIN DECLARE done BOOLEAN DEFAULT FALSE; DECLARE v_site_id VARCHAR(2); DECLARE v_name VARCHAR(10); DECLARE c_cur CURSOR FOR SELECT eno FROM k; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; SET @AUTOCOMMIT = 0; SET @v_name = 'keyanda'; OPEN c_cur; loop1 :LOOP FETCH FROM c_cur INTO v_site_id; IF done THEN CLOSE c_cur; LEAVE loop1; END IF; SET @p_error_code = 0; SET @p_error_msg = 'Successfullyprocessed'; END | DELIMITER ;
错误原因及修复方案
- LOOP语句未闭合:原代码定义了
loop1 :LOOP,但缺少对应的END LOOP;语句,导致语法结构不完整,这是触发报错的直接原因。 - 变量赋值混淆:存储过程的OUT参数
p_error_code、p_error_msg是局部参数,不需要加@前缀;声明的局部变量v_name不应使用用户变量格式@v_name;设置自动提交的@AUTOCOMMIT写法错误,应改为SET AUTOCOMMIT = 0;。
修复后的完整代码
DELIMITER | CREATE PROCEDURE LyrisDbcleanup(OUT p_error_code INT, OUT p_error_msg VARCHAR(250)) BEGIN DECLARE done BOOLEAN DEFAULT FALSE; DECLARE v_site_id VARCHAR(2); DECLARE v_name VARCHAR(10); DECLARE c_cur CURSOR FOR SELECT eno FROM k; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; SET AUTOCOMMIT = 0; SET v_name = 'keyanda'; OPEN c_cur; loop1 :LOOP FETCH FROM c_cur INTO v_site_id; IF done THEN CLOSE c_cur; LEAVE loop1; END IF; SET p_error_code = 0; SET p_error_msg = 'Successfully processed'; END LOOP loop1; COMMIT; END | DELIMITER ;
额外说明
- 确保游标查询的表
k存在,且字段eno类型与v_site_id的VARCHAR(2)兼容,避免运行时数据类型不匹配错误。 - 若无需事务控制,可移除
SET AUTOCOMMIT = 0;和COMMIT;语句,保持默认自动提交模式。
内容的提问来源于stack exchange,提问作者Keyan
相关产品推荐
相关产品推荐

