MySQL存储过程循环并执行更新操作脚本示例

MySQL存储过程循环并执行更新操作脚本示例

下面是批量修改用户密码的存储过程,有时候我们会收到客户批量修改密码的需求,可以参考如下:
这里是每个用户的密码都不一样

DELIMITER $$

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    PROCEDURE `platform`.`batchUpdateUserPassword`()
    /*LANGUAGE SQL
    | [NOT] DETERMINISTIC
    | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
    | SQL SECURITY { DEFINER | INVOKER }
    | COMMENT 'string'*/
	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 ;

以上是MySQL存储过程循环更新的脚本,具体的业务可以参考此脚本实现。

执行脚本

CALL `batchUpdateUserPassword`()

你可能感兴趣的:(MySQL)