mysql存储过程--数据库批量更新组织机构树的层级name

数据库根据组织机构树的层级code批量更新组织机构树的层级name

需求描述

组织机构树,每个组织机构都有层级code(level_code),根据level_code可知其上级组织信息,现在需要根据level_code 获得其level_name,通过存储过程批量更新org表中每个组织机构的level_name,如下图所示结构

在这里插入图片描述

MySQL存储过程

CREATE PROCEDURE `updateLevelName`(tenantId VARCHAR(4))
BEGIN
-- 声明变量
DECLARE cid VARCHAR(255);
DECLARE done INT;
DECLARE len INT;
DECLARE i INT;
DECLARE orgName VARCHAR(255);
DECLARE orgName1 VARCHAR(255);
 
-- 创建游标,并设置游标所指的数据(这里设置ID不为1是因为ID1的是总的大类)
DECLARE cur CURSOR for 
	SELECT level_code as cid from tab_org where del_flag = '0' AND tenant_id = tenantId;
-- 游标执行完,即遍历结束。设置done的值为1
DECLARE CONTINUE HANDLER for not FOUND set done=1;
-- 开启游标
open cur;
-- 执行循环
posLoop:LOOP
-- 如果done的值为1,即遍历结束,结束循环
	IF done=1 THEN
		LEAVE posLoop;
-- 注意,if语句需要添加END IF结束IF
END IF;
-- 从游标中取出cid
FETCH cur INTO cid;

-- 计算每个levelCode的长度len
SELECT LENGTH(level_code) INTO len FROM tab_org WHERE level_code = cid AND del_flag='0' AND tenant_id = tenantId;

-- 初始化orgName为根节点
SET orgName = (SELECT name FROM tab_org WHERE level_code = LEFT(cid,3) AND del_flag='0' AND tenant_id = tenantId);
-- 初始化i的值为6
SET i=6;

WHILE  i<=len DO
SELECT name INTO orgName1 FROM tab_org WHERE level_code = LEFT(cid,i) AND del_flag='0' AND tenant_id = tenantId;
SET orgName = CONCAT(orgName,'-',orgName1);
SET i=i+3;
END WHILE;

-- 更新level_name
UPDATE tab_org SET level_name = orgName WHERE level_code = cid AND del_flag='0' AND tenant_id = tenantId;

-- 关闭循环
END LOOP posLoop;
-- 关闭游标
CLOSE cur;
-- 关闭分隔标记
END
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
更新组织机构层级可以使用MySQL中的递归查询和更新语句。以下是一个例子,假设有一个名为`org`的表,其中包含组织机构的ID、名称、父级ID和层级: ``` CREATE TABLE org ( id INT PRIMARY KEY, name VARCHAR(50), parent_id INT, level INT ); INSERT INTO org VALUES (1, 'A', NULL, 1); INSERT INTO org VALUES (2, 'B', 1, 2); INSERT INTO org VALUES (3, 'C', 1, 2); INSERT INTO org VALUES (4, 'D', 2, 3); INSERT INTO org VALUES (5, 'E', 2, 3); INSERT INTO org VALUES (6, 'F', 3, 3); INSERT INTO org VALUES (7, 'G', NULL, 1); INSERT INTO org VALUES (8, 'H', 7, 2); INSERT INTO org VALUES (9, 'I', 8, 3); ``` 现在我们想要更新每个组织机构层级。我们可以使用以下查询语句: ``` UPDATE org o JOIN ( SELECT id, IFNULL(parent_id, 0) AS parent_id, 1 AS level FROM org WHERE parent_id IS NULL UNION ALL SELECT o.id, o.parent_id, p.level + 1 FROM org o JOIN ( SELECT id, level FROM org ) p ON o.parent_id = p.id ) q ON o.id = q.id SET o.level = q.level; ``` 这个查询语句使用了递归,首先找到所有顶级组织机构(即`parent_id`为空的记录),并将它们的层级设置为1。然后,查询语句递归地将每个组织机构层级设置为其父级组织机构层级加1。最后,使用`JOIN`语句将查询结果与原始表进行连接,并使用`SET`语句更新每个组织机构层级。 执行以上查询语句后,`org`表将会变成这样: ``` +----+------+-----------+-------+ | id | name | parent_id | level | +----+------+-----------+-------+ | 1 | A | NULL | 1 | | 2 | B | 1 | 2 | | 3 | C | 1 | 2 | | 4 | D | 2 | 3 | | 5 | E | 2 | 3 | | 6 | F | 3 | 3 | | 7 | G | NULL | 1 | | 8 | H | 7 | 2 | | 9 | I | 8 | 3 | +----+------+-----------+-------+ ``` 这里可以看到,每个组织机构层级已经正确地更新了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值