> 数据库 > MySQL >

mysql 存储过程+游标完成批处理

mysql 存储过程+游标完成批处理
1.案例介绍
本例作用:配置线入参为空,则将当前用户维护所有配置线关系。配置线入参非空,则维护当前用户配置线关系。

2.创建存储过程
DELIMITER $$  -- 自定义结束符
  drop procedure if exists insert_user_branch_ralation; -- 删除已有的存储过程
  CREATE PROCEDURE insert_user_branch_ralation(in cmuPid int,in branchId int)  -- 创建存储过程 两个入参 用户ID和配置线ID
    BEGIN
   declare s int DEFAULT 0;  -- 声明四个变量
   declare cmbPid int;  -- 配置线ID
   declare braCode varchar(15);  -- 配置线码值(本例中没有用到)
   declare braName varchar(15);-- 配置线名称(本例中没有用到)
   declare branch cursor for select a.cmb_pid,a.sub_branch_code,a.sub_branch_name from cgp_mng_branch a ; -- 创建游标并将查询结果放入branch游标中
   declare continue handler for sqlstate '02000' set s=1;  -- 如果游标中没有值了 则将变量s设置为1

   if branchId is not null then  -- 入参为空则先删后增
    DELETE from cgp_mng_userbra where cmu_pid = cmuPid and cmb_pid = branchId;
    insert into cgp_mng_userbra(cmu_pid,cmb_pid,createdBy,createdTime,validity) values(cmuPid,branchId,'admin',NOW(),'1');
   else  -- 入参为空 则删除当前用户所有配置线 在维护上所有配置线
    DELETE from cgp_mng_userbra where cmu_pid = cmuPid;
   
    open branch; -- 打开游标
   
    fetch branch into cmbPid,braCode,braName; -- 将游标中的值取出来放到上边声明的变量里边
    while s<>1 do     -- 如果s不等于1 就执行循环
     insert into cgp_mng_userbra(cmu_pid,cmb_pid,createdBy,createdTime,validity) values(cmuPid,cmbPid,'admin',NOW(),'1');
     FETCH branch into cmbPid,braCode,braName; -- 再在循环中将游标中的值传入到变量中
    end while ;
    -- 关闭游标
    close branch;
   end if;
    END
    $$
DELIMITER ;  -- 将结束符还原为分号



3.调用存储过程
call insert_user_branch_ralation(3,1);  -- 给用户3维护1配置线
call insert_user_branch_ralation(2,null); -- 给用户2维护所有配置线
---------------------

(责任编辑:IT)