程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle管道函數(PipelinedTableFunction)介紹

Oracle管道函數(PipelinedTableFunction)介紹

編輯:Oracle教程

一 概述:

1、管道函數即是可以返回行集合(可以使嵌套表nested table 或數組 varray)的函數,我們可以像查詢物理表一樣查詢它或者將其

賦值給集合變量。

2、管道函數為並行執行,在普通的函數中使用dbms_output輸出的信息,需要在服務器執行完整個函數後一次性的返回給客戶端。如果需要在客戶端實時的輸出函數執行過程中的一些信息,在oracle9i以後可以使用管道函數(pipeline function)。

3、關鍵字PIPELINED表明這是一個oracle管道函數,oracle管道函數的返回值類型必須為集合,在函數中,PIPE ROW語句被用來返回該集合的單個元

素,函數以一個空的RETURN 語句結束,以表明它已經完成。

4、由於管道函數的並發多管道流式設計以及實時返回查詢結果而去除了中間環節因此可以帶來可觀的性能提升。

二、如何編寫管道函數:
例1:
CREATE OR REPLACE PACKAGE pkg1 AS
    TYPE numset_t IS TABLE NUMBER;
    FUNCTION f1(x NUMBER) RETURN numset_t PIPELINED;
END pkg1;

CREATE OR REPLACE PACKAGE BODY pkg1 AS
    FUNCTION f1(x NUMBER) RETURN numset_t PIPELINED IS
        BEGIN
            FOR i IN 1..x LOOP
                PIPE ROW(i);
            END LOOP;
            RETURN;
        END;
END pkg1;SELECT * FROM TABLE(pkg1.f1(5));COLUMN_VALUE
------------------------
1
2
3
4
5

三 管道函數用於數據轉換

例2:管道函數可以和常規函數一樣接收任何參數,下面的管道函數中參數為ref cursor。

CREATE OR REPLACE PACKAGE refcur_pkg IS
  TYPE refcur_t IS REF CURSOR RETURN emp%ROWTYPE;
  TYPE outrec_typ IS RECORD (
    var_num    NUMBER(6),
    var_char1  VARCHAR2(30),
    var_char2  VARCHAR2(30));
  TYPE outrecset IS TABLE OF outrec_typ;
 FUNCTION f_trans(p refcur_t)
      RETURN outrecset PIPELINED;
END refcur_pkg;

CREATE OR REPLACE PACKAGE BODY refcur_pkg IS
  FUNCTION f_trans(p refcur_t)
   RETURN outrecset PIPELINED IS
    out_rec outrec_typ;
    in_rec  p%ROWTYPE;
  BEGIN
  LOOP
    FETCH p INTO in_rec;
    EXIT WHEN p%NOTFOUND;
    -- first row
    out_rec.var_num := in_rec.empno;
    out_rec.var_char1 := in_rec.ename;
    out_rec.var_char2 := in_rec.mgr;
    PIPE ROW(out_rec);
    -- second row
    out_rec.var_num := in_rec.deptno;
    out_rec.var_char1 := in_rec.deptno;
    out_rec.var_char2 := in_rec.job;
    PIPE ROW(out_rec);
  END LOOP;
  CLOSE p;
  RETURN;
  END;
END refcur_pkg;

SELECT * FROM TABLE(
   refcur_pkg.f_trans(CURSOR(SELECT * FROM emp WHERE empno=7782)));

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved