Oracle管道函數示例

Oracle的管道函數須要定義下面的三樣:數據庫

Record/Object Type:定義一個Record或Object類型的變量,這個變量用於表示返回結果集的一行數據,有點像C#中的DataRow類。數組

Table Type:定義一個集合類型,這個類型由Record/Object Type填充。這個類型也能夠理解爲一個Record/Object的數組。函數

Function:定義個返回類型爲Table Type的函數。這個函數負責生成結果集。spa

上述三個數據庫對象通常定義在一個包內,可是Object Type不能定義在包內,須要在包外部定義,包內引用。code

 

示例:對象

 1 CREATE OR REPLACE PACKAGE PCK_TEST AS
 2 
 3 TYPE TYPE_TEST IS RECORD
 4 (
 5   R_VAL         NUMBER,
 6   DATE_VALUE    DATE,
 7   TEST_FIELD    VARCHAR2(50 BYTE)
 8 );
 9 
10 TYPE TABLE_TEST IS TABLE OF TYPE_TEST;
11 
12 FUNCTION F_TEST_TABLE(P_DATE IN VARCHAR2) RETURN TABLE_TEST PIPELINED;
13 
14 END PCK_TEST;
 1 CREATE OR REPLACE PACKAGE BODY PCK_TEST AS
 2 
 3 FUNCTION F_TEST_TABLE(P_DATE IN VARCHAR2) RETURN TABLE_TEST PIPELINED IS
 4 
 5   L_ROW   TYPE_TEST;
 6   
 7 BEGIN
 8 
 9   FOR I IN 1..10
10   LOOP
11     
12     L_ROW.R_VAL := I;
13     L_ROW.DATE_VALUE := TO_DATE(P_DATE,'YYYY-MM-DD HH24:MI:SS');
14     L_ROW.TEST_FIELD := 'TEST';
15     ---若是TYPE_TEST定義爲Object類型,則能夠這麼賦值
16     ---L_ROW := TYPE_TEST(I,TO_DATE(P_DATE,'YYYY-MM-DD HH24:MI:SS'),'TEST')
17     PIPE ROW(L_ROW);
18     
19     
20   END LOOP;
21   RETURN;
22 
23 EXCEPTION
24   --YOUR EXCEPTION SQL STATEMENT
25   WHEN OTHERS THEN RETURN;
26 END F_TEST_TABLE;
27 
28 
29 END PCK_TEST;

 

調用函數:blog

調用時須要與Table關鍵字配合使用,以下圖所示。io

相關文章
相關標籤/搜索