MySQL创建含游标Event报错求助:解决1064语法错误
排查MySQL Event中的1064语法错误
我帮你梳理下代码里的几个关键问题,这些就是导致你遇到1064语法错误的核心原因:
- DECLARE语句位置违规:在MySQL的存储程序(Event、存储过程等)中,所有
DECLARE声明必须放在所有可执行语句的最前面。你把SET lc_current_time = ...放在了DECLARE select_cursor之前,直接违反了语法规则,这是第一个错误的根源。 - IF语句语法错误:MySQL的条件判断语法是
IF 条件 THEN ... END IF;,不是你使用的大括号{}形式,这触发了第二个1064错误。 - 缺少循环终止条件:你的
LOOP没有退出逻辑,会导致无限循环,必须添加游标遍历完毕的捕获处理来终止循环。 - 未设置自定义分隔符:当Event体包含多个语句时,默认的
;分隔符会让MySQL提前截断Event定义,导致解析失败,需要先修改分隔符。
修正后的完整代码
DELIMITER // CREATE EVENT api_5 ON SCHEDULE EVERY 360 SECOND DO BEGIN -- 所有DECLARE必须放在代码块最开头 DECLARE lc_current_time DATETIME; DECLARE unuse_count INT; DECLARE auto_assign TINYINT; DECLARE total_sum INT; DECLARE check_count INT; -- 添加游标遍历完成的标记,用于退出循环 DECLARE done INT DEFAULT FALSE; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; SET lc_current_time = CONVERT_TZ(NOW(), @@session.time_zone, '+0:00'); DECLARE select_cursor CURSOR FOR SELECT unuse_count, auto_assign, total_sum, check_count FROM new_api; OPEN select_cursor; -- 给循环命名,方便后续退出 cursor_loop: LOOP FETCH select_cursor INTO unuse_count, auto_assign, total_sum, check_count; -- 游标遍历完所有数据时退出循环 IF done THEN LEAVE cursor_loop; END IF; -- 修正IF语句的标准语法 IF unuse_count <= check_count THEN INSERT INTO api_report(date, new_api_id, api_name, type, status, email, customer_id, unuse_count, check_count) VALUES (lc_current_time, 5, 'abc', 4, 1, 'abc@gmail.com', check_count, unuse_count); END IF; END LOOP cursor_loop; CLOSE select_cursor; END // -- 恢复默认分隔符 DELIMITER ;
额外说明
- 先通过
DELIMITER //修改分隔符,确保Event体内部的;不会被MySQL提前识别为语句结束符。 - 添加的
done变量和CONTINUE HANDLER会在游标遍历完所有数据时触发,主动终止循环。 - 所有
DECLARE语句都移到了代码块最开头,完全符合MySQL的存储程序语法规范。
内容的提问来源于stack exchange,提问作者Ankit Doshi
相关产品推荐
相关产品推荐

