MySQL存储过程变量赋值后定义游标报ERROR 1064语法错误怎么办
错误原因
- DECLARE声明顺序不符合MySQL语法规则。存储过程
BEGIN块内的所有DECLARE语句必须集中放在最顶部,且顺序必须遵循「普通变量→游标→HANDLER」的要求,不能穿插SET、UPDATE这类执行语句。代码中先执行了给变量赋值的SET语句,后续再声明游标直接触发1064报错。 - 变量名使用了MySQL保留字。
count是MySQL内置聚合函数名,属于保留字,直接作为自定义变量名会导致语法解析错误。 - 代码存在多处语法逻辑错误:
- IF分支内多写了一个
end loop;,破坏了语句块的嵌套结构 - ELSE分支中
set salary = salary + tmpSL where employee_id = empID是非法写法,需要改为完整的UPDATE语句 done变量未初始化默认值为FALSE,后续NOT FOUND HANDLER的触发逻辑会出现异常- 部分语句末尾缺少分号结束符
- IF分支内多写了一个
修复后完整代码
use lab3New; delimiter $ drop procedure if exists Q4C; create procedure Q4C() BEGIN -- 声明普通变量 declare bonus decimal(8,2) default 100000; declare emp_count int default 0; declare done int default FALSE; declare empSL decimal(8,2); declare tmpSL decimal(8,2); declare empID decimal(6,0); -- 声明游标 declare myCursor cursor for select salary, employee_id from employees order by salary asc; -- 声明HANDLER declare continue handler for not found set done = TRUE; open myCursor; read_loop:LOOP fetch myCursor into empSL, empID; if done then leave read_loop; end if; set tmpSL = 0.2 * empSL; if tmpSL > bonus then update employees set salary = salary + bonus where employee_id = empID; set bonus = 0; set emp_count = emp_count + 1; else set bonus = bonus - tmpSL; update employees set salary = salary + tmpSL where employee_id = empID; set emp_count = emp_count + 1; end if; end loop read_loop; close myCursor; select emp_count; END$ delimiter ;
内容的提问来源于stack exchange,提问作者Orion447
相关产品推荐
相关产品推荐

