Oracle 管道化表函数(Pipelined Table)[转载]
在實際的應用中,為了讓PL/SQL 函數返回數據的多個行,必須通過返回一個 REF CURSOR 或一個數據集合來完成。REF CURSOR 的這種情況局限于可以從查詢中選擇的數據,而整個集合在可以返回前,必須進行具體化。 9i 通過引入的管道化表函數糾正了后一種情況。表函數是返回整個行的集(通常作為一個集合)的函數,可以直接從 SQL 語句中進行查詢,就好像它是一個真正的數據庫表一樣。管道化表函數與之相似,但是它像在構建時一樣返回數據,而不是一次全部返回。管道化表函數更加有效, 因為數據可以盡可能快地返回。
??? 管道化表函數必須返回一個集合。在函數中,PIPE ROW 語句被用來返回該集合的單個元素,該函數必須以一個空的 RETURN 語句結束,以表明它已經完成。一旦我們創建了上述函數,我們就可以使用 TABLE 操作符從 SQL 查詢中調用它。
例1:
Type Definition
2 (
3 -- Attributes
4 ? colorName Varchar2(10),
5 colorCode varchar2(10)
6
7 -- Member functions and procedures
8 ?--member procedure <ProcedureName>(<Parameter> <Datatype>)
9 ?); 復制代碼
?
Create Table Type
CREATEORREPLACE TYPE COLOR_TYPE ASTABLEOF COLOR_HEX_CODE;?
Create Table Function
1 CREATEORREPLACEFUNCTION F_PIPELINE_TEST RETURN COLOR_TYPE PIPELINED2 ?AS
3 ?BEGIN
4 PIPE ROW(COLOR_HEX_CODE('black','#000000'));
5 PIPE ROW(COLOR_HEX_CODE('white','#FFFFFF'));
6 PIPE ROW(COLOR_HEX_CODE('red','#FF0000'));
7 PIPE ROW(COLOR_HEX_CODE('green','#00FF00'));
8 PIPE ROW(COLOR_HEX_CODE('blue','#0000FF'));
9 RETURN;
10 ?END; 復制代碼
?
測試:
select*fromtable( f_pipeline_test );?
?
?
結果:
COLORNAME? COLORCODE
black ? #000000
white ? #FFFFFF
red ? #FF0000
green ? #00FF00
blue ? #0000FF
例2:實現split函數功能
?
1 CREATEORREPLACEFUNCTION F_SPLIT2 (
3 P_STR INVARCHAR2,
4 P_DELIMITER INvarchar2
5 ) RETURN RESOLVE_STR PIPELINED
6 ?AS
7 j INT :=0;
8 i INT :=1;
9 lenINT :=0;
10 len1 INT :=0;
11 tmp VARCHAR2 (4000);
12 v_str VARCHAR2 (4000);
13 ?BEGIN
14 v_str := TRIM(BOTH P_DELIMITER FROM P_STR);--去掉前后的分隔符
15 ?len := LENGTH (v_str);
16 len1 := LENGTH(P_DELIMITER);
17
18 WHILE j <len
19 LOOP
20 j := INSTR (v_str, P_DELIMITER, i);--尋分隔符位置
21 ?
22 IF j =0THEN--沒有了
23 ? tmp := SUBSTR (v_str, i);
24 PIPE ROW (tmp);
25 EXIT;--結束
26 ?ELSE
27 tmp := SUBSTR (v_str, i, j - i);
28 i := j + len1;
29 PIPE ROW (tmp);
30 ENDIF;
31 END LOOP;
32
33 RETURN;
34 END; 復制代碼
?
?
?
測試:
SELECT*FROMTABLE (F_SPLIT('-12-02-ab-cd-a0-ef-', '-'));例3:產生6個0..49的隨機數
First the quick-and-dirty solution without a pipelined function
2 select r from (
3 select rownum r from all_objects where rownum <50
4 ) orderby dbms_random.VALUE
5 )where rownum <=6; 復制代碼
?
pipelined function
CREATEORREPLACE TYPE ARRAY ASTABLEOFNUMBER;?
1 CREATEORREPLACEFUNCTION gen_numbers(n INNUMBERDEFAULTNULL)2 RETURN ARRAY PIPELINED
3 AS
4 BEGIN
5 FOR i IN1 .. nvl(n,9999)
6 LOOP
7 PIPE ROW(i);
8 END LOOP;
9 RETURN;
10 END; 復制代碼
?
測試:
1 select*from (2 select*
3 from (select*fromtable(gen_numbers(49))) orderby dbms_random.random
4 )
5 where rownum <=6 復制代碼
generating that range of dates
select to_date('2009-5-10','yyyy-mm-dd') + column_value-1fromTABLE(gen_numbers(15));Note the name of the column we used: COLUMN_VALUE. That is the default name for the column coming back from the PIPELINED function.
another example
?
1 CREATEORREPLACEFUNCTION date_table(sdate DATE, edate DATE)2 RETURN date_array PIPELINED AS
3 BEGIN
4 FOR i IN0 .. (edate - sdate)
5 LOOP
6 PIPE ROW(sdate + i);
7 END LOOP;
8 RETURN;
9 END date_table; 復制代碼
轉載于:https://www.cnblogs.com/soundcode/archive/2012/01/04/2311934.html
總結
以上是生活随笔為你收集整理的Oracle 管道化表函数(Pipelined Table)[转载]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Js选择框脚本 移动操作select 标
- 下一篇: 畅享基金是什么