MySQL存储过程循环并执行更新操作脚本示例
DELIMITER $$
CREATE
PROCEDURE `platform`.`batchUpdateUserPassword`()
BEGIN
-- 定义变量
DECLARE s INT DEFAULT 0;
-- 定义前缀,有默认值
DECLARE prefix VARCHAR(20) DEFAULT 'china@';
-- 用户id
DECLARE report_user_id VARCHAR(32);
-- 登录名称
DECLARE report_loginname VARCHAR(50);
-- 密码盐
DECLARE report_salt VARCHAR(20);
-- 新md5密码
DECLARE md5pwd VARCHAR(32);
-- 新md5加盐密码
DECLARE md5saltPwd VARCHAR(32);
-- 定义游标,并将sql结果集赋值到游标中,数据集条件可以修改
DECLARE report CURSOR FOR SELECT id,loginname,salt FROM `user` WHERE id IN ('de5e19f281be11e9ad644ccc6a047afa','de5e1a2d81be11e9ad644ccc6a047afa');
-- 声明当游标遍历完后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
-- 打开游标
OPEN report;
-- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致
FETCH report INTO report_user_id,report_loginname,report_salt;
-- 当s不等于1,也就是未遍历完时,会一直循环
WHILE s<>1 DO
-- 构造新的密码
SET md5pwd=(SELECT CONCAT(prefix,report_loginname));
SET md5saltPwd=(SELECT CONCAT(prefix,report_loginname,report_salt));
-- 执行更新业务逻辑
UPDATE `user` SET `password`=MD5(md5saltPwd),md_pwd=MD5(md5pwd) WHERE id=report_user_id;
-- 将游标中的值再赋值给变量,供下次循环使用
FETCH report INTO report_user_id,report_loginname,report_salt;
-- 当s等于1时表明遍历以完成,退出循环
END WHILE;
-- 关闭游标
CLOSE report;
END$$
DELIMITER ;
-- 查看定时器是否开启
-- show variables like 'event%';
-- 如果是OFF,则用 SET GLOBAL event_scheduler = 1;
-- 或者SET GLOBAL event_scheduler = ON;开启。开启后其Value则为ON。
-- mysql创建定时任务事件
CREATE EVENT `event_alarmClearTime`
ON SCHEDULE
EVERY '1' DAY STARTS '2021-05-19 10:55:00' -- 每天早晨05:50:00 执行一遍
DO call batchUpdateUserPassword();

浙公网安备 33010602011771号