oracle中如何编写树级代码

原创 2004年05月29日 15:54:00

这是在2002年给一个制衣厂做系统的时候写的,请大家多批评指正!

create table Dept(
 DepartNO  varchar2(10),
   DepartName  varchar2(20),
 TopNo    varchar2(10));

insert into Dept values('001','懂事会','0');
insert into Dept values('002','总裁办','001');
insert into Dept values('003','财务部','001');
insert into Dept values('004','市场部','002');
insert into Dept values('005','公关部','002');
insert into Dept values('006','销售部','002');
insert into Dept values('007','分销处','006');
insert into Dept values('008','业务拓展处','004');
insert into Dept values('009','销售科','007');

CREATE TABLE TempDept
(
 TempdeptNo    char(4), /*部门编号*/
 TempdeptName   varchar2(20), /*部门名称*/
  UpperTempdeptNo  char(4), /*上级部门编号*/
  UpperTempdeptName  varchar2(20), /*上级部门名称*/
 TempdeptLevel   number(4) /*部门所处的级别*/
);

select departname
from dept
connect by prior departno=topno
start with topno='0';

select a.departname top ,b.departname next
from dept a,dept b
where a.departno=b.topno;

select lpad(departno,level*2+length(departno),'/')
from dept
start with topno='0'
connect by prior departno=topno;

select departno,departname,level ||'/'|| topno
from dept
start with topno='0'
connect by prior departno=topno;

select lpad(departno,level*2+length(departno),' ')
from dept
start with topno='0'
connect by prior departno=topno;

select lpad(departno,level*3,' ')
from dept
start with topno='0'
connect by prior departno=topno;

create or replace function GetLevel(TempNo varchar2)
return varchar2
IS
 Result  varchar2(20);
 cursor CurLevel(curTempNo varchar2)
 is
 select departNo
 from dept
 connect by prior departNo = TopNo
 start with TopNo = curTempNo;
begin
 open CurLevel;
 for v_sor in CurLevel(TempNo) loop
   Result:=Result || '/' || v_sor.curTempNo;
 end loop;
 return(Result);
 close CurLevel;
  dbms_output.put_line('success');
end GetLevel;


REM************************************************************
REM**********   生成部门之间形成的树结构     ******************
REM********** 功能:输入部门后自动产生该部门  ******************
REM**********      及其子部门之间的树关系()  ******************
REM********** 输入参数:部门编号ParaDeptId   ******************
REM************************************************************

CREATE OR REPLACE procedure getAllSubDeptId(ParaDeptId varchar2)
IS
    DeptNo1       varchar2(4);     /*存放部门编号*/
    UpperDeptNo1  varchar2(4);     /*存放该部门的上级部门编号*/
    UpperDeptNo2  varchar2(4);     /*存放查询同级上级部门编号*/
    UpperDeptNo3  varchar2(4);     /*存放查询的上级部门编号*/
       level         number;          /*部门所处级别*/
    DSql          varchar2(100);   /*动态SQL字符串*/
    CURSOR getDept IS
       select DepartNO,TopNo
       from dept
       where DepartNo != ParaDeptId;
BEGIN
 --DSql :='create table tempdept(TempdeptNo,TempdeptName,UpperTempdeptNo,
  --UpperTempdeptName,TempdeptLevel)';
 --EXECUTE IMMEDIATE DSql;
   DSql :='TRUNCATE TABLE TempDept';
   dbms_output.put_line(0);
   EXECUTE IMMEDIATE DSql;
   dbms_output.put_line(1);
   insert into TempDept values(ParaDeptId,Null,Null,Null,0);
   dbms_output.put_line(2);
   open getDept;
   fetch getDept into DeptNo1,UpperDeptNo1;
   WHILE ( SQLCODE = 0 )
   LOOP
      level := 1 ;
      UpperDeptNo3 := UpperDeptNo1;
      WHILE ( UpperDeptNo1 is NOT NULL )
      loop
         if (UpperDeptNo1 = ParaDeptId) then
            insert into tempdept           values(DeptNo1,NULL,UpperDeptNo3,NULL,level);
           exit;
        else
           UpperDeptNo2 := UpperDeptNo1;
           select topNo into UpperDeptNo1
           from  dept
           where Departno= UpperDeptNo2;
           if UpperDeptNo2 != UpperDeptNo1
    then
                level := level+1;
           end if;
         end if;
      END LOOP;
     fetch getDept into DeptNo1,UpperDeptNo1;
   END LOOP;
   close getDept;
END;
/

Oracle树查询(查询所有子节点,父节点等等)

Oracle树查询的最重要的就是select...start with... connect by ...prior 语法了。依托于该语法,我们可以将一个表形结构的中以树的顺序列出来。在下面列述了...
  • qiange520
  • qiange520
  • 2016年01月14日 10:11
  • 8152

oracle查询出树形结构的表,父节点数据是子节点的数据和

我们在查询数据时,经常会想查询出树形结构的数据,父节点数据是子节点的数据和,如下图: 通常会想到查出所有数据后台构造,但是这种方式运行效率低且复杂 如何直接oracle直接查询出数...
  • Fupengyao
  • Fupengyao
  • 2016年10月11日 15:35
  • 1934

oracle列级权限控制

客户有个需求,一张150多个字段的表,客户要求只将部分字段给扫描公司的人看,这个需求用视图就可以很容易实现,客户又要求,这些字段,扫描公司只可以修改其中的个别字段,我之前还真没遇到这样在列级别做权限控...
  • shengxiaweizhi
  • shengxiaweizhi
  • 2015年08月03日 22:31
  • 719

Oracle行级锁的特殊用法简析

Oracle有许多的锁,各种锁的效用是不一样的。下面重点介绍Oracle行级锁,Oracle行级锁只对用户正在访问的行进行锁定。可以更好的保证数据的安全性,需要的朋友可以了解下 Oracle...
  • zcouy
  • zcouy
  • 2017年06月16日 11:26
  • 360

Oracle表级触发器语句

孟子辰 2016-12-04 06:22 示例一、只有在每个月的10日才允许办理,新员工入职与离职,其他时间不允许增加和删除员工数据 --建立表 CREATE TABLE myemp A...
  • u011277123
  • u011277123
  • 2016年12月13日 09:08
  • 577

穿线树实现无限级分类

分类,分组在Web应用中到处可见,理想的原型设计,总是会遇到各种各样的新的更新需求,而来自客户的需求变更(客户简单的一句加一个下级分类),可能导致的是项目重大重构。为什么我们不从一开始就把分类做成树形...
  • Joph_csu
  • Joph_csu
  • 2017年01月07日 21:39
  • 686

Oracle树查询及函数

Oracle树查询的最重要的就是select...start with... connect by...prior语法了。依托于该语法,我们可以将一个表形结构的中以树的顺序列出来。在下面列述了Orac...
  • u014421556
  • u014421556
  • 2016年06月16日 10:04
  • 8113

使用Jquery+bootstrap无限级菜单树

无限级菜单树的实现效果从数据库提取出来的原始数据前台代码需要的数据{ "code": 100, "extend": { "children": [ ...
  • EnTaroAdunZ
  • EnTaroAdunZ
  • 2017年08月10日 00:43
  • 726

ORACLE B树索引概念的理解

B树索引的概念: B树索引是一个典型的树结构,不紧oracle,很多实际应用都用到,在oracle里面分三个索引块 1 - 叶子节点块(leaf block):直接指向表里的数据行。 2 - 分支节点...
  • diyyong
  • diyyong
  • 2014年02月13日 14:26
  • 3232

基于语法树生成代码

package com.xxx.xx.xxx.ast; import java.util.Collection; import java.util.Iterator; import java.uti...
  • dongjian764
  • dongjian764
  • 2013年12月04日 10:10
  • 1121
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oracle中如何编写树级代码
举报原因:
原因补充:

(最多只允许输入30个字)