前一阵,我们在为客户移植ORACLE应用到达梦7时, 碰到了PL/SQL的PIPELINED TABLE FUNCTION,经过努力现在达梦7也支持了这个特性。简单介绍一下其用法:
先创建一个嵌套表类型s100_t:
SQL>create or replace type s100_t is table of varchar(100);
2 /
操作已执行
已用时间: 119.854(ms) clock tick:245457446. Execute id is 7.
然后创建一个普通的函数, 它返回一个嵌套表对象,其内容通过普通的元素赋值获得:
SQL>create or replace function s100f1 return s100_t is
2 a s100_t;
3 begin
4 a = s100_t('hello', 'world', 'xxxx');
5 a.extend(2);
6
7 a(4) = 'yyyy';
8 a(5) = 'uuuu';
9 return a;
10 end;
11 /
操作已执行
已用时间: 270.073(ms) clock tick:553103141. Execute id is 8.
S100f2函数是一个管道表函数, 使用了pipe row语句。这个函数不需要显式创建一个对象, 也不需要返回值:
SQL>create or replace function s100f2 return s100_t
2 pipelined
3 is
4 begin
5 pipe row('hello');
6 pipe row('world');
7 end;
8 /
操作已执行
已用时间: 134.468(ms) clock tick:275385227. Execute id is 9.
下面使用一个匿名脚本打印s100f1的结果:
SQL>declare
2 b s100_t;
3 begin
4 b = s100f1;
5 for i in 1..b.count loop
6 print b(i);
7 end loop;
8 end;
9 /
hello
world
xxxx
yyyy
uuuu
PL/SQL 过程已成功完成
已用时间: 101.508(ms) clock tick:207884297. Execute id is 10.
对于管道表函数, 也可以同样输出:
SQL>declare
2 b s100_t;
3 begin
4 b = s100f2;
5 for i in 1..b.count loop
6 print b(i);
7 end loop;
8 end;
9 /
hello
world
PL/SQL 过程已成功完成
已用时间: 212.282(ms) clock tick:434746279. Execute id is 11.
当然也可以这样, 直接用select 语句输出:
SQL>select * from table(s100f2);
行号 C
---------- -----
1 hello
2 world
已用时间: 115.449(ms) clock tick:236433874. Execute id is 12
转自:
http://blog.sina.com.cn/s/blog_6f86f39a0101d3qz.html