Oracle Pipelined Table Functions

在实际的应用中,为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。 9i 通过引入的管道化表函数纠正了后一种情况。表函数是返回整个行的集(通常作为一个集合)的函数,可以直接从 SQL 语句中进行查询,就好像它是一个真正的数据库表一样。管道化表函数与之相似,但是它像在构建时一样返回数据,而不是一次全部返回。管道化表函数更加有效,因为数据可以尽可能快地返回。

 

 

管道化表函数必须返回一个集合。在函数中,PIPE ROW 语句被用来返回该集合的单个元素,该函数必须以一个空的 RETURN 语句结束,以表明它已经完成。一旦我们创建了上述函数,我们就可以使用 TABLE 操作符从 SQL 查询中调用它。

 

 

管道化表函数经常被用来把数据从一种类型转化成另一种类型。

/*
概况   
基本上,当你希望一个PLSQL(或者java或者c)程序作为数据源,而不是表,   
你可能会用到管道函数(pipelined function).   
pipelined function操作起来就像一张表   
一个pl/sql函数可能会用于数据仓库的数据库里面,转换大量的数据。 
这可能包括格式化一系列转换数据,它们是不同的函数执行后得到的结果。   
在Oracle database 9i之前,大量的数据转换,既需要显著的内存开销,   
又需要在转换的每个阶段将数据存储在中间表里面。在这两种情况下,   
加载进程都会致使性能的下降。
使用PL/SQL表函数,可以在数据转换的时候有效的减少开销。PL/SQL表函数   
可以接收和返回多行,交付这些数据,当他们准备好的时候,而不是一次性的处理;   
而且PL/SQL表函数还可以并行执行操作。 
*/
CREATE OR REPLACE TYPE str_array AS TABLE OF VARCHAR2(10);
/

CREATE OR REPLACE FUNCTION tf(stringin VARCHAR2)
  RETURN str_array PIPELINED IS i PLS_INTEGER;
str VARCHAR2(100);
tab sys.dbms_utility.uncl_array;
BEGIN
  str := '"' || REPLACE(stringin, ',', '","') || '"';
  sys.dbms_utility.comma_to_table(str, i, tab);

  FOR j IN 1 .. 5 LOOP
    PIPE ROW(TRANSLATE(tab(j), 'A"', 'A'));
  END LOOP;
  RETURN;
END tf;
/

SELECT * FROM TABLE(CAST(tf('1001,1002,1003,1004,1005') AS str_array));

 

 

猜你喜欢

转载自wuhuizhong.iteye.com/blog/1987812
今日推荐