您好,欢迎访问一九零五行业门户网

利用Oracle存储过程生成树编码

需求 字段 描述 备注 id 主键,32位uuid type_code 编码 如:1-01-003 parent_id 父节点id,32
需求
字段
描述
备注
id
主键,32位uuid
type_code
编码
如:1-01-003
parent_id
父节点id,,32位uuid
sort_num
排序编号
正整数
假设顶级节点的type_code为字符1,写存储过程把表中所有的节点type_code生成好;
二级节点前面补一个龄,三级补两个零,依次类推;
实现关键点
不知道系统有多少层级,需要递归调用
通过递归调用自身;
如何动态在type_code前面填充‘0’;通过计算‘-’的个数来确定层级,从而确定前缀的个数
tree_level:= (length(p_code)-length(replace(p_code,'-',''))) + 1;
前面填充前缀‘0’字符
lpad(to_char(cnt),tree_level,'0')
存储过程代码
createor replace procedure ini_tree_code
(
  v_parent_id in varchar2
)as
  p_id  varchar2(32);
  p_code varchar2(256);
sub_num  number(4,0);
  tree_level number(4,0);
  cnt      number(4,0) default 0;
cursor treecur(oid varchar2) is
  select id,type_code from eval_index_type
  where parent_id = oid
  order by sort_num;
begin
  sub_num := 0;
select id,type_code into p_id,p_code
  from eval_index_type
  where id = v_parent_id
  order by sort_num;
for currow in treecur(p_id) loop
    cnt := cnt +1;
    tree_level :=(length(p_code)-length(replace(p_code,'-',''))) + 1;
update eval_index_type set type_code =p_code || '-' || lpad(to_char(cnt) ,tree_level,'0')
    where id = currow.id;
select count(*) into sub_num fromeval_index_type where parent_id = p_id;
if sub_num > 0 then
      ini_tree_code (currow.id);
    end if;
  end loop;
endini_tree_code;
本文永久更新链接地址:
其它类似信息

推荐信息