很早之前,大概2、3年以前,就看到过PIPE函数,当时由于没有什么具体的需求需要使用这种函数,所以就没有深究。
同样是由于没有具体的需求,也就没有写过关于这种函数的例子。因为我认为为了PIPE函数而写PIPE函数的意义不大,而当时又没有找到除了PIPE函数而使用其他方法解决不了的案例,所以一直没有描述过这种函数。
这两天在研究树形查询,自己通过PL/SQL实现CONNECT BY NOCYCLE的时候,意外的碰到了一种情况,感觉使用PIPE函数是最佳解决方法,于是有了这篇文章。
由于这篇文章的例子来源于下面两篇文章,所以单独看这篇文章可能无法理解文章中例子的含义,建议先阅读下面两个链接,然后再看这篇文章。
10g树形查询新特性CONNECT_BY_ISCYCLE的9i实现方式(一):http://database.ctocio.com.cn/tips/420/8232920.shtml
10g树形查询新特性CONNECT_BY_ISCYCLE的9i实现方式(二):http://database.ctocio.com.cn/tips/467/8232967.shtml
10g新增了一些树形查询的伪列和操作,使得树形查询的功能更加强大。而9i中由于没有对应的功能,可能会导致很多问题很难实现。于是写了几篇文章描述10g中的一些功能如何在9i中实现。
其中最难实现的功能莫过于CONNECT BY NOCYCLE了。由于必须自己来实现树形查询的功能,因此选择通过PL/SQL编写函数,通过递归调用的方式实现CONNECT BY NOCYCLE的功能。又因为PL/SQL获取的是一个ID的列表,因此还需要将其转为为表函数关联原表来获取详细的记录。
一个简单的例子如下:
| SQL> CREATE TABLE T_TREE 2 ( 3 PK NUMBER PRIMARY KEY, 4 ID NUMBER, 5 FATHER_ID NUMBER, 6 NAME VARCHAR2(30) 7 ); |
表已创建。
| SQL> INSERT INTO T_TREE VALUES (1, 1, 0, 'A'); 已创建 1 行。 SQL> INSERT INTO T_TREE VALUES (2, 2, 1, 'BC'); 已创建 1 行。 SQL> INSERT INTO T_TREE VALUES (3, 3, 1, 'DE'); 已创建 1 行。 SQL> INSERT INTO T_TREE VALUES (4, 4, 1, 'FG'); 已创建 1 行。 SQL> INSERT INTO T_TREE VALUES (5, 5, 2, 'HIJ'); 已创建 1 行。 SQL> INSERT INTO T_TREE VALUES (6, 6, 4, 'KLM'); 已创建 1 行。 SQL> INSERT INTO T_TREE VALUES (7, 7, 6, 'NOPQ'); 已创建 1 行。 SQL> INSERT INTO T_TREE VALUES (8, 0, 0, 'ROOT'); 已创建 1 行。 SQL> INSERT INTO T_TREE VALUES (9, 4, 7, 'FG'); 已创建 1 行。 SQL> COMMIT; |

