赞
踩
在日常开发中如果遇到如下情况:
需要插入或修改批量数据,但是批量数据是从另一条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返回的字段名不可重名
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。