这本是网友的一个问题。用了比较愚笨的方法解决的。抛砖引玉。
问题如下:
有两张表如下
表1是原始表,表2的内容是把上级和下级的全部对应起来,包括自己,
比如表1上级2对应的下级有30,20,然后30的下级又有300
在表2中就要写4条记录,分别为30,20,300,2这几个下级。
不知道大伙能听明白否
表1
上级 下级
1 20
2 30
3 10
2 20
30 300
表2
上级 下级
1 20
1 1
2 30
2 20
2 2
3 10
3 3
30 300
2 300
30 30
解决方法:

SQL> create table a(u number(3),l number(3))2 ;

Table created

SQL> insert into a(u,l) values(1,20);

1 row inserted
SQL> insert into a(u,l) values(2,30);

1 row inserted

SQL> insert into a(u,l) values(3,10);

1 row inserted

SQL> insert into a(u,l) values(2,20);

1 row inserted

SQL> insert into a(u,l) values(30,300);

1 row inserted
SQL> commit;

Commit complete

1,创建类型

create or replace type r_type is object(u number,l number);
create or replace type t_table is table of r_type;

2,创建function
create or replace function getData return t_table
as
cursor ca is select distinct u from a;
rs ca%rowtype;
cursor cb(kk number) is select * from a connect by prior l=u start with u=kk;
rr cb%rowtype;
rs2 t_table:=t_table();
liu number;
i integer;
begin
i:=1;
open ca;
loop
fetch ca into rs;
exit when ca%notfound;
open cb(rs.u);
loop
fetch cb into rr;
exit when cb%notfound;
rs2.extend(1);
rs2(i):= r_type(rs.u,rr.l);
i:=i+1;
end loop;
rs2.extend(1);
rs2(i):= r_type(rs.u,rs.u);
i:=i+1;
close cb;
end loop;
close ca;
return rs2;
end;

3,查询验证
SQL> select * from table(getdata);

U L
---------- ----------
30 300
30 30
1 20
1 1
2 30
2 300
2 20
2 2
3 10
3 3

10 rows selected



原帖子地址:http://community.csdn.net/Expert/topic/5524/5524982.xml?temp=.5684473