利用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;

时间: 2024-10-06 15:10:17

利用oracle存储过程生成树代码的相关文章

Oracle 存储过程 split 代码实现

实现 字符串分割, 算法 如下: 算法 1: DECLARE remove_column myvarray_list; x varchar(1000); sub varchar(1000); i NUMBER; j NUMBER; c NUMBER; rcount NUMBER; BEGIN remove_column := myvarray_list(); --init array. sub:='ORA-26786: 键为 ("AAC001") = (1137091119660605

C#调用Oracle存储过程

C#调用Oracle存储过程的代码如下所示: 1 using System; 2 using System.Collections.Generic; 3 using System.Collections.ObjectModel; 4 using System.ComponentModel; 5 using System.Configuration; 6 using System.Data; 7 using System.Data.OracleClient; 8 using System.Draw

oracle存储过程---获取数据库中到指定经纬度距离的坐标

新项目需求: 结合百度地图,在地图中指定一个地点,获取此地点周围1km范围内所有数据库中存的单位的地点和信息标记在地图上.于是初写了一把oracle的存储过程,纯靠摸索写的. 后台需要的函数如下: 首先,计算圆弧函数 CREATE OR REPLACE FUNCTION RAD(d number) RETURN NUMBER is PI number :=3.141592625; begin return  d* PI/180.0; end ; 然后,计算距离函数 CREATE OR REPLA

C#调用 Oracle 存储过程样例代码

-- 建表CREATE TABLE sale_report (     sale_date DATE NOT NULL ,     sale_item VARCHAR(2) NOT NULL ,      sale_money DECIMAL(10,2) NOT NULL,      PRIMARY KEY(sale_date, sale_item)); -- 測试数据DECLAREv_begin_day DATE;v_end_day DATE;BEGIN v_begin_day := TO_D

java代码调用oracle存储过程

一.简介 与调用mysql存储过程类型过程都是如下 1.创建连接 Connection conn = DriverManager.getConnection(url, user, password); 2.创建CallableStatement CallableStatement statement = conn.prepareCall(sql); 3.设置参数 statement.setInt(1, id); statement.registerOutParameter(2, Types.VA

oracle 存储过程的基本语法

原文:oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字(    参数1 IN NUMBER,    参数2 IN NUMBER) IS变量1 INTEGER :=0;变量2 DATE;BEGIN END 存储过程名字 2.SELECT INTO STATEMENT  将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条  记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)  例子:  

Oracle存储过程的学习

存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名=param1: If (判断条件) then Select 列名 into 变量2 from 表A where列名=param1: Dbms_output.Put_line('打印信息'); El

Oracle存储过程(转)

存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名=param1: If (判断条件) then Select 列名 into 变量2 from 表A where列名=param1: Dbms_output.Put_line('打印信息'); El

Oracle 存储过程_(收集)

oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字(    参数1 IN NUMBER,    参数2 IN NUMBER) IS变量1 INTEGER :=0;变量2 DATE;BEGIN END 存储过程名字 2.SELECT INTO STATEMENT  将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条  记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)  例子:   BEG