Oracle管道函数(Pipelined Table Function)介绍

前端之家收集整理的这篇文章主要介绍了Oracle管道函数(Pipelined Table Function)介绍前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


一 概述:

1、管道函数即是可以返回行集合(可以使嵌套表nested table 或数组 varray)的函数,我们可以像查询物理表一样查询它或者将其 赋值给集合变量。

2、管道函数为并行执行,在普通的函数中使用dbms_output输出的信息,需要在服务器执行完整个函数后一次性的返回给客户端。如果需要在客户端

实时的输出函数执行过程中的一些信息,在oracle9i以后可以使用管道函数(pipeline function)。

3、关键字PIPELINED表明这是一个Oracle管道函数,oracle管道函数的返回值类型必须为集合,在函数中,PIPE ROW语句被用来返回该集合的单个元

素,函数以一个空的RETURN 语句结束,以表明它已经完成。


4、由于管道函数的并发多管道流式设计以及实时返回查询结果而去除了中间环节因此可以带来可观的性能提升。


二、如何编写管道函数

例1:
  1. @H_404_74@CREATE@H_404_74@OR@H_404_74@REPLACE@H_404_74@PACKAGEpkg1AS@H_404_74@
  2. @H_404_74@TYPEnumset_tIS@H_404_74@TABLE@H_404_74@NUMBER;
  3. @H_404_74@FUNCTION@H_404_74@f1(xNUMBER)RETURN@H_404_74@numset_tPIPELINED;
  4. @H_404_74@END@H_404_74@pkg1;

  1. @H_404_74@CREATE@H_404_74@OR@H_404_74@REPLACE@H_404_74@PACKAGEBODYpkg1AS@H_404_74@
  2. @H_404_74@FUNCTION@H_404_74@f1(xNUMBER)RETURN@H_404_74@numset_tPIPELINEDIS@H_404_74@
  3. @H_404_74@BEGIN@H_404_74@
  4. @H_404_74@FOR@H_404_74@iIN@H_404_74@1..xLOOP
  5. @H_404_74@PIPEROW(i);
  6. @H_404_74@END@H_404_74@LOOP;
  7. @H_404_74@RETURN@H_404_74@;
  8. @H_404_74@END@H_404_74@;
  9. @H_404_74@END@H_404_74@pkg1;
  1. @H_404_74@SELECT@H_404_74@*FROM@H_404_74@TABLE@H_404_74@(pkg1.f1(5));
COLUMN_VALUE
------------------------
1
2
3
4
5


三 管道函数用于数据转换:


例2:管道函数可以和常规函数一样接收任何参数,下面的管道函数中参数为ref cursor。

  1. @H_404_74@CREATE@H_404_74@OR@H_404_74@REPLACE@H_404_74@PACKAGErefcur_pkgIS@H_404_74@
  2. @H_404_74@TYPErefcur_tIS@H_404_74@REFCURSOR@H_404_74@RETURN@H_404_74@emp%ROWTYPE;
  3. @H_404_74@TYPEoutrec_typIS@H_404_74@RECORD(
  4. @H_404_74@var_numNUMBER(6),
  5. @H_404_74@var_char1VARCHAR2(30),
  6. @H_404_74@var_char2VARCHAR2(30));
  7. @H_404_74@TYPEoutrecsetIS@H_404_74@TABLE@H_404_74@OF@H_404_74@outrec_typ;
  8. @H_404_74@FUNCTION@H_404_74@f_trans(prefcur_t)
  9. @H_404_74@RETURN@H_404_74@outrecsetPIPELINED;
  10. @H_404_74@END@H_404_74@refcur_pkg;

  1. @H_404_74@CREATE@H_404_74@OR@H_404_74@REPLACE@H_404_74@PACKAGEBODYrefcur_pkgIS@H_404_74@
  2. @H_404_74@FUNCTION@H_404_74@f_trans(prefcur_t)
  3. @H_404_74@RETURN@H_404_74@outrecsetPIPELINEDIS@H_404_74@
  4. @H_404_74@out_recoutrec_typ;
  5. @H_404_74@in_recp%ROWTYPE;
  6. @H_404_74@BEGIN@H_404_74@
  7. @H_404_74@LOOP
  8. @H_404_74@FETCH@H_404_74@pINTO@H_404_74@in_rec;
  9. @H_404_74@EXITWHEN@H_404_74@p%NOTFOUND;
  10. @H_404_74@--firstrow@H_404_74@
  11. @H_404_74@out_rec.var_num:=in_rec.empno;
  12. @H_404_74@out_rec.var_char1:=in_rec.ename;
  13. @H_404_74@out_rec.var_char2:=in_rec.mgr;
  14. @H_404_74@PIPEROW(out_rec);
  15. @H_404_74@--secondrow@H_404_74@
  16. @H_404_74@out_rec.var_num:=in_rec.deptno;
  17. @H_404_74@out_rec.var_char1:=in_rec.deptno;
  18. @H_404_74@out_rec.var_char2:=in_rec.job;
  19. @H_404_74@PIPEROW(out_rec);
  20. @H_404_74@END@H_404_74@LOOP;
  21. @H_404_74@CLOSE@H_404_74@p;
  22. @H_404_74@RETURN@H_404_74@;
  23. @H_404_74@END@H_404_74@;
  24. @H_404_74@END@H_404_74@refcur_pkg;

  1. @H_404_74@SELECT@H_404_74@*FROM@H_404_74@TABLE@H_404_74@(
  2. @H_404_74@refcur_pkg.f_trans(CURSOR@H_404_74@(SELECT@H_404_74@*FROM@H_404_74@empWHERE@H_404_74@empno=7782)));

VAR_NUM VAR_CHAR1 VAR_CHAR2
---------- ------------------------------ ------------------------------
7782 CLARK 7839
10 10 MANAGER

---------------------------------------
By Dylan.

原文链接:https://www.f2er.com/oracle/211616.html

猜你在找的Oracle相关文章