mysql 存储过程执行while循环 Lost connection to MySQL server during query
1. 存储过程
存储过程中可以执行while循环,其实还有repeat, loop等循环,但是自己写java比较多,还是比较习惯while循环.
今天在执行while循环更新表的过程中,出现了死循环,程序已经执行了,但是跳不出循环.
点击停止后
显示结果,但是程序没有正常结束,而是在人为的干预下才结束.
2.脚本
drop procedure if exists msgSolu; CREATE PROCEDURE msgSolu ( ) begin declare tableCount int default 0; declare tableName varchar(1000) character set utf8; declare sqlStr varchar(1000) character set utf8; declare tableNameTotal varchar(1000) character set utf8; declare done int default 0; -- 声明游标 declare mc cursor for select table_name from INFORMATION_SCHEMA.tables where table_name like 'message_info_%' and table_schema = 'eip-nvwa'; declare continue handler for not found set done = 1; set tableCount = (select count(1) from INFORMATION_SCHEMA.tables where table_name like 'message_info_%' and table_schema = 'eip-nvwa'); set tableNameTotal = ''; -- 打开游标 open mc; WHILE done<=tableCount DO -- 获取结果 fetch mc into tableName; IF done > tableCount-5 THEN select tableName; END IF; set done=done+1; set @sqlStr = CONCAT(' UPDATE ',tableName,' SET PARAM = CONCAT( ''2'' ) WHERE MSGTYPE = ''审批结果'' '); PREPARE DS FROM @sqlStr; execute DS; DEALLOCATE prepare DS; END WHILE; -- 这里是为了显示获取结果 -- 关闭游标 close mc; end
就是根据表名统一更新表,是利用游标和while循环完成的.
3.解决
declare continue handler for not found set done = 1;
存储过程里面有这句话,这句话的意思是如果游标为空则给done赋值为1,所以当游标运行到超过最大数量以后,done就重新赋值为1,while循环判断 1 < tableCount,所以就成了死循环了.
我们直接把 done = 1 改成 done = 100 , 超过最大的 tableCount 即可跳出循环.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程