MySQL遍历select语句的查询结果

在日常开发中如果遇到如下情况:
需要插入或修改批量数据,但是批量数据是从另一条selec语句中查询出来的结果集

备注:以下代码只适用于必须使用SQL执行的情况,非必要使用SQL时使用mybatis-plus的固有API即可。

废话少说,上代码

-- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除
DROP PROCEDURE IF EXISTS biz_customer_depart;
-- 受MySQL版本影响,可能有些同志执行SQL时会因为分号的原因自动结束语句执行,导师存储过程创建失败,这里建议暂时把SQL语句的结束符由分号
-- 改为双斜杠,在存储过程创建完毕之后在改回分号
delimiter //
-- 创建存储过程
CREATE PROCEDURE biz_customer_depart()
BEGIN
	-- 定义变量
	-- 以下定义的变量是根据博主自己的业务场景定义的,变量名字,变量个数,变量类型可根据需求自定定义
	DECLARE s int DEFAULT 0;
	DECLARE biz_customer_id varchar(32);
	DECLARE biz_customer_userId varchar(32);
	DECLARE biz_customer_departId varchar(32);
	-- 定义游标,并将sql结果集赋值到游标中
	-- 游标中存放的结果集就是我们标题中说的select结果集,结果集的字段有几个,我们上面变量就定义几个
	DECLARE report CURSOR FOR select c.id as id ,c.user_id as userId,u.department_id as departId from biz_customer c left join sys_user u on c.user_id = u.id;
	-- 声明当游标遍历完后将标志变量置成某个值
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
	-- 打开游标
	open report;
		-- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致
		fetch report into biz_customer_id,biz_customer_userId,biz_customer_departId;
		-- 当s不等于1,也就是未遍历完时,会一直循环
		while s<>1 do
			-- 执行业务逻辑
			update biz_customer set depart_id = biz_customer_departId where id = biz_customer_id and user_id = biz_customer_userId;
			-- 将游标中的值再赋值给变量,供下次循环使用
			fetch report into biz_customer_id,biz_customer_userId,biz_customer_departId;
		-- 当s等于1时表明遍历以完成,退出循环
		end while;
	-- 关闭游标
	close report;
-- 注意:这里的 END // 是结束存储过程的意思,开头我们曾把语句结束符改为了双斜杠
END //
-- 存储过程结束之后在改回默认的分号结束符
delimiter ;
-- 执行存储过程
-- 切记切记 一定要执行存储过程,只有执行了才能生效
call biz_customer_depart();

注意:
1、受MySQL版本的影响,部分同志会执行失败,一定一定要记得修改语句结束符,把分号改为其他符号,在存储过程定义完成之后在恢复
2、一定注意结果集,也就是select语句的返回结果有几个字段,这个变量就定义几个字段,变量与select返回的字段名不可重名

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值