一 概述:
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