利用oracle存储过程生成树代码

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

需求

字段

描述

备注

ID

主键,32位UUID

 

TYPE_CODE

编码

如:1-01-003

PARENT_ID

父节点ID,32位UUID

 

SORT_NUM

排序编号

正整数

假设顶级节点的TYPE_CODE为字符1,写存储过程把表中所有的节点TYPE_CODE生成好;

二级节点前面补一个龄,三级补两个零,依次类推;

实现关键点

n  不知道系统有多少级,需要递归调用

通过递归调用自身;

n  如果动态在TYPE_CODE前面填充0;通过计算‘-’的个数来确定层级

tree_level:= (length(p_code)-length(replace(p_code,‘-‘,‘‘))) + 1;

 

n  前面填充前缀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;


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。