
这是在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; /
|