首页 > 数据库 > Oracle > 正文

oracle中如何编写树级代码

2024-08-29 13:30:34
字体:
来源:转载
供稿:网友
,欢迎访问网页设计爱好者web开发。
这是在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;
/

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表