MYSQL存储过程:递归查询父节点,并更新数据

业务描述:机构向下管理,需要获取每个机构的所有上级节点,并得到对应的级别
效果,如图:
执行前:

执行后:

存储过程:
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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值