mysql 嵌套游标实现的一个函数
第一、函数的创建、执行、删除
-- ----------------------------
-- 创建
-- 根据本地用户表中现有部门生成机构表数据,同时重建机构和用户的关联关系
-- ----------------------------
DROP FUNCTION IF EXISTS `_buildOrgAndOrgUserRel`;
DELIMITER ;;
CREATE FUNCTION `_buildOrgAndOrgUserRel` (name varchar(50)) RETURNS mediumtext CHARSET utf8
begin
declare _org_full_name varchar(500); -- 机构全称
declare _org_abr varchar(20); -- 机构简称
declare _sort int default 0;
declare _success_msg varchar(50) default '重建机构及机构用户关系成功'; -- 机构全称
-- 遍历数据结束标志
declare done int DEFAULT 0;
-- 获取用户表中唯一的部门信息列表
declare orgCur cursor for select distinct department from jsh_user where department!='' and department is not null;
-- 将结束标志绑定到游标
declare continue handler for not found set done = 1;
-- 循环部门信息列表在机构表插入数据
-- 打开游标
open orgCur;
-- 开始循环
read_loop: loop
-- 提取游标里的数据,这里只有一个,多个的话也一样;
fetch orgCur into _org_full_name;
-- 声明结束的时候
if done=1 then
leave read_loop;
end if;
-- 这里做你想做的循环的事件
if length(_org_full_name)<=20 then
set _org_abr=_org_full_name;
else
set _org_abr=left(_org_full_name,20);
end if;
set _sort=_sort+1;
insert into jsh_organization (org_full_name, org_abr, org_stcd, org_parent_no, sort, remark)
values (_org_full_name,_org_abr, '1', '01', _sort, '机构表初始化');
begin
declare _userId bigint;
declare _orgId bigint;
-- 遍历数据结束标志
declare ogrUserRelDone int DEFAULT 0;
-- 根据用户表和机构表部门关联关系,重建用户和机构关联关系
declare ogrUserRelCur cursor for select user.id as userId,org.id as orgId from jsh_user user,jsh_organization org
where 1=1 and user.department=org.org_full_name and user.department =_org_full_name;
-- 将结束标志绑定到游标
declare continue handler for not found set ogrUserRelDone = 1;
-- 打开游标
open ogrUserRelCur;
-- 开始循环
rel_read_loop: loop
-- 提取游标里的数据,这里只有一个,多个的话也一样;
fetch ogrUserRelCur into _userId,_orgId;
-- 声明结束的时候
if ogrUserRelDone=1 then
leave rel_read_loop;
end if;
insert into `jsh_orga_user_rel`(`orga_id`, `user_id`, `delete_flag`) VALUES (_orgId,_userId,'0');
end loop rel_read_loop;
-- 关闭游标
close ogrUserRelCur;
end;
end loop read_loop;
-- 关闭游标
close orgCur;
-- 清空用户表中的部门信息
update jsh_user set department=null;
return _success_msg;
end
;;
DELIMITER ;
-- ----------------------------
-- 执行
-- 初始化机构数据,重建机构用户关系
-- ----------------------------
select _buildOrgAndOrgUserRel('初始化机构数据,重建机构用户关系') from dual;
-- ----------------------------
-- 删除
-- 删除一次性函数
-- ----------------------------
DROP FUNCTION _buildOrgAndOrgUserRel;
0 打赏
打赏 1 积分后可见