MYSQL存储过程:递归查询父节点,并更新数据
2018-03-07 16:53
337 查看
业务描述:机构向下管理,需要获取每个机构的所有上级节点,并得到对应的级别效果,如图:执行前:
执行后:
存储过程:BEGIN DECLARE fid varchar(100) default ''; DECLARE str varchar(100000) default ''; DECLARE level_m INTEGER DEFAULT 0; DECLARE rootId varchar(100) default ''; DECLARE rootId_mid varchar(100) default ''; -- 创建自定义控制游标循环变量 DECLARE done TINYINT DEFAULT FALSE; -- 创建自定义游标 并输入结果集 DECLARE my_cursor CURSOR FOR SELECT comcode from xj_prpdcompany ; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; DROP table if exists str_spilt_result; CREATE TEMPORARY TABLE str_spilt_result(`id` int(11) NOT NULL AUTO_INCREMENT,code VARCHAR(20),cname VARCHAR(10000),level_n int(4),PRIMARY KEY (`id`)); -- 打开游标 OPEN my_cursor; -- 循环开始 my_loop: LOOP FETCH NEXT FROM my_cursor INTO rootId; IF done THEN LEAVE my_loop; END IF; set str=rootId; set rootId_mid=rootId; set level_m=0; -- 这里做你想做的循环的事件 WHILE rootId_mid !='' and rootId is not NULL do SET fid =(SELECT supercomcode FROM xj_prpdcompany WHERE comcode = rootId_mid); IF fid is not null THEN SET str = concat(str, ',', fid); set level_m =level_m+1; END IF; SET rootId_mid = fid; END WHILE; insert into str_spilt_result(code,cname,level_n) values(rootId,str,level_m); END LOOP my_loop; COMMIT; CLOSE my_cursor; -- 关闭游标 select * from str_spilt_result; update xj_prpdcompany p,str_spilt_result t set p.supercomcode=t.cname,p.`level`=t.level_n where p.comcode=t.code; COMMIT;END
执行后:
存储过程:BEGIN DECLARE fid varchar(100) default ''; DECLARE str varchar(100000) default ''; DECLARE level_m INTEGER DEFAULT 0; DECLARE rootId varchar(100) default ''; DECLARE rootId_mid varchar(100) default ''; -- 创建自定义控制游标循环变量 DECLARE done TINYINT DEFAULT FALSE; -- 创建自定义游标 并输入结果集 DECLARE my_cursor CURSOR FOR SELECT comcode from xj_prpdcompany ; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; DROP table if exists str_spilt_result; CREATE TEMPORARY TABLE str_spilt_result(`id` int(11) NOT NULL AUTO_INCREMENT,code VARCHAR(20),cname VARCHAR(10000),level_n int(4),PRIMARY KEY (`id`)); -- 打开游标 OPEN my_cursor; -- 循环开始 my_loop: LOOP FETCH NEXT FROM my_cursor INTO rootId; IF done THEN LEAVE my_loop; END IF; set str=rootId; set rootId_mid=rootId; set level_m=0; -- 这里做你想做的循环的事件 WHILE rootId_mid !='' and rootId is not NULL do SET fid =(SELECT supercomcode FROM xj_prpdcompany WHERE comcode = rootId_mid); IF fid is not null THEN SET str = concat(str, ',', fid); set level_m =level_m+1; END IF; SET rootId_mid = fid; END WHILE; insert into str_spilt_result(code,cname,level_n) values(rootId,str,level_m); END LOOP my_loop; COMMIT; CLOSE my_cursor; -- 关闭游标 select * from str_spilt_result; update xj_prpdcompany p,str_spilt_result t set p.supercomcode=t.cname,p.`level`=t.level_n where p.comcode=t.code; COMMIT;END
相关文章推荐
- MYSQL存储过程:批量更新数据2(产品品牌)
- MYSQL存储过程:批量更新数据
- MYSQL存储过程:批量更新数据
- MYSQL存储过程:批量更新数据2(产品品牌)
- MYSQL存储过程:批量更新、插入数据、游标
- MySQL存储过程实例——实现查询数据表,有则更新无则插入
- Mysql存储过程数据汇总(一)
- 一个MySQL清除数据库所有表数据保留表结构的存储过程
- MYSQL 查询包含某个数据表的所有存储过程
- 答:SQLServer DBA 三十问之一: char、varchar、nvarchar之间的区别(包括用途和空间占用);xml类型查找某个节点的数据有哪些方法,哪个效率高;使用存储 过程和使用T-SQL查询数据有啥不一样;
- 自动生成表的添加更新数据的存储过程
- mysql存储过程之游标遍历数据表
- Mybatis应用mysql存储过程查询数据
- JDBC基于MVC架构项目实例-实现对MySQL数据表的增删改查、调用数据表中的存储过程和函数
- MySQL 存储过程插入大量测试数据
- sqlserver数据导入mysql八: 把sqlserver中的存储过程注释后创建到mysql中(留着人工修改)
- [置顶] 【mysql 存储过程】存储过程的应用--数据迁移和更新
- mysql数据存储过程参数实例详解
- MySQL存储过程:实现更新UUID
- 自动生成对一个数据表的插入和更新的存储过程