oracle中生成树中每个节点对应其所有子孙的映射

el/2023/12/3 2:57:08

这本是网友的一个问题。用了比较愚笨的方法解决的。抛砖引玉。

问题如下:

 有两张表如下
表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 numberis 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


http://www.ngui.cc/el/1460889.html

相关文章

郁闷呀

黑暗中需要美梦,此刻却清醒! 苍穹中没有闪亮,无边的寂静! 眩晕中思考,思考中眩晕。 再多疲劳,都不会被击溃。 该死的郁闷,见鬼去吧! 该死的电脑不知道抽啥邪风,没头没脑的…

不喜欢郭晶晶的N个理由

郭晶晶,大家都应该很知道的了,名人吗! 郭晶晶其时早在1996年的亚特兰大就亮了相了,但是一直都没有取得金牌。本想悉尼的时候能有所突破,结果复出的伏明霞夺走了可能属于她…

银行,你太无耻了

央行为了利用利率杠杆适当抑制投资和信贷需求的扩张,已经在近一年多的时间来多次调息,计划在6.5号的调息之后,利率将要比目前的利率高出0.5个百分点。 本次调整前后的利率对比如下: 项 目 调整前利率% 调…

DotNet下简单的程序部署

如果要在VisualStudio .net 中部署软件,有很多种方法的,最简单的方法就是创建一 个《安装和部署》- 《安装项目》。具体细节如下: 1. custom 文件夹的Property 属性 默认都是大写。并可以作为变量使用 [PROPERTYNAME] 如果没…

Oracle中在view,trigger,procedure中跨用户访问表的问题

当Oracle中需要跨用户访问对象的时候,一般用 user.object 或者 public Synonym 。当然前提是需要有授权 才行。 有时候我们为了管理上的方便,可能中间用了角色。 假如 user1,user2 。  role1 把 role1 授给 user2, user1把表的操作…

pb7下使用几个Win32 API 的例子

pb7下会用到API来处理很多底层的操作。因为PB7在数据库方面强,在别的方面就显得很弱。pb7中使用win32 API 也是很简单的。首先对要使用的win32 API 进行声明,然后就是调…

C#中关于集合的一个小例子

这是一个在c#中使用集合的一个小小的例子,里面涉及到了 Hashtable,ArrayList,集合的排序,枚举器,集合的遍历,成员的查找。 例子如下: Form1代码: publicpartialclassForm1 : Form …

VB+MFTPX.OCX访问ftp服务器的小例子

mftpx.ocx是一个不错的控件,只是不支持中文的路径和空格,比较让人恼火。最后只能通过其他的手段来弥补他的这个不足。 首先当然要引用MFTPX.OCX 。 代码如下: PrivateDeclareFunction ShellExecute()Function ShellExecute Lib "shell3…

C#中导出数据到EXCEL的简单例子

这几天没事在网上闲逛的时候看到类似的代码,花了点时间测试了一下。觉得不错。简单的整理一下。 在项目中需要引用:COM:Microsoft Office 11.0 Object Library COM:Microsoft Excel 11.0 Object Library 简单封装的代码类&#…

vb.net 开发 excel Addin学习(1)---- 准备

安装 vs.net2005 安装 microsoft visual studio 2005 tools for office runtime microsoft visual studio 2005 tools for office runtime language pack 安装office2003 sp2 .net 支持 创建一个项目 .net 中新建一个 其他项目类型 -…