1、概述
在oracle中管道函数是用来返回行集合的,我们可以像查询物理表一样查询它或者将它的值赋给其它集合变量。
oracle中的管道函数有以下几个特点:
- 管道函数为并行执行,在普通的函数中使用dbms_output输出的信息,需要在服务器执行完整个函数后一次性的返回给客户端。如果需要在客户端实时的输出函数执行过程中的一些信息,在oracle9i以后可以使用管道函数。
- 关键字PIPELINED表明这是一个oracle管道函数,oracle管道函数的返回值类型必须为集合,在函数中,PIPE
ROW语句被用来返回该集合的单个元素,函数以一个空的RETURN 语句结束,以表明它已经完成。 - 由于管道函数的并发多管道流式设计以及实时返回查询结果而去除了中间环节因此可以带来可观的性能提升。
简而言之,oracle中使用管道函数最基本的功能就是来返回多条记录。
2、oracle管道函数例子
oracle中编写管道函数方法:
SQL> create or replace type MsgType as table of varchar2(4000);
2 /
Type created.
SQL> create or replace function f_pipeline_test return MsgType
PIPELINED as
2 3 begin
4 for i in 1 .. 10 loop
5 pipe row('Iteration ' || i || ' at ' || systimestamp);
6 sys.dbms_lock.sleep(1);
7 end loop;
8 pipe row('All done!');
9 return;
10 end;
11 /
Function created.
执行:
SQL> select * from table( f_pipeline_test );
COLUMN_VALUE
--------------------------------------------------------------------------------
Iteration 1 at 25-MAR-20 03.23.00.720946000 PM +08:00
Iteration 2 at 25-MAR-20 03.23.01.720776000 PM +08:00
Iteration 3 at 25-MAR-20 03.23.02.720742000 PM +08:00
Iteration 4 at 25-MAR-20 03.23.03.720712000 PM +08:00
Iteration 5 at 25-MAR-20 03.23.04.720725000 PM +08:00
Iteration 6 at 25-MAR-20 03.23.05.720725000 PM +08:00
Iteration 7 at 25-MAR-20 03.23.06.720716000 PM +08:00
Iteration 8 at 25-MAR-20 03.23.07.720693000 PM +08:00
Iteration 9 at 25-MAR-20 03.23.08.720720000 PM +08:00
Iteration 10 at 25-MAR-20 03.23.09.720731000 PM +08:00
All done!
11 rows selected.
3、PostgreSQL管道函数实现方法
在PostgreSQL中对应的功能是setof 表示返回多条记录。
例:
bill@bill=>create or replace function split (text,text) returns setof text as $$
bill$# select regexp_split_to_table($1,$2);
bill$# $$ language sql strict;
CREATE FUNCTION
bill@bill=>select split('a-b-c-d','-');
split
-------
a
b
c
d
(4 rows)