表值函數是一個可以在SELECT......FROM
子句后調用的函數,返回的是一個集合類型,后續可以通過TABLE
子句轉換為可以在SQL語句中處理的行/列數據。
適用場景
表值函數適用于以下場景,可以很大程度簡化操作:
- 合并特定會話中的數據表。例如,在SQL語句中可以合并兩個放在不同表中的數據。
- 用編程的方式構造數據集,以某個固定的格式傳遞給用戶終端。如果需要構造某些數據,表值函數可以直接通過函數生成構造好的數據,而省去了構造關系表。
- 使用流水線函數提高并行查詢的性能。
FROM
子句中的表值函數可以將查詢序列化,得到更高的查詢性能。
創建表值函數
- 將函數的
RETURN
類型定義為集合類型(通常是嵌套表或者可變數組,但是某些情況下也可使用關聯數組)。說明 該類型必須在數據庫級別定義(通過CREATE TYPE
命令),或者在包中定義(針對于流水線函數)。 - 確保函數的所有參數類型都是
IN
模式,并且是SQL命令兼容的類型。例如,SQL中不允許輸入RECORD
類型。 - 在
TABLE
子句中嵌入對函數的調用。
示例
創建表值函數
- 創建嵌套表。
CREATE OR REPLACE TYPE polar_strings IS TABLE OF VARCHAR2 (100);
- 創建表值函數,返回上述嵌套表類型。
CREATE OR REPLACE FUNCTION get_random_str (count_in IN INTEGER) RETURN polar_strings IS item polar_strings := polar_strings (); BEGIN item.EXTEND (count_in); FOR i IN 1 .. count_in LOOP item (i) := DBMS_RANDOM.string ('u', 10); END LOOP; RETURN item; END;
- 在PL/SQL中調用表值函數生成一系列字符。
返回結果如下:DECLARE item polar_strings := get_random_str (5); BEGIN FOR i IN 1 .. item.COUNT LOOP DBMS_OUTPUT.put_line (item (i)); END LOOP; END;
CIDKUKWNMV GRSNSGJULU XXCMTMLYUI YWQDIMNEZA BHTWWLCGFN
使用表值函數
- 調用
get_random_str
表值函數,傳入的參數值為5,返回5個隨機的字符串。
返回結果如下:SELECT rs.COLUMN_VALUE my_string FROM TABLE (get_random_str (5)) rs
my_string ------------ JAFSOSYOUA VNWSAAAHNA MAEDHVHLIU PRWUJLPKZJ MWZKQZKQJZ (5 行記錄)
- 調用
get_random_str
表值函數,顯式指定表值函數的參數值count_in
,返回5個隨機的字符串。
返回結果如下:SELECT COLUMN_VALUE my_string FROM TABLE (get_random_str (count_in => 5))
my_string ------------ TRHYTVPPOU DJFDIYAYAF BKJOYQFAJR YCIIBEFSVT OYCUDMUDMX (5 行記錄)
- 調用
get_random_str
表值函數,返回5個隨機字符串。再調用SUM和AVG兩個聚合函數計算出返回隨機字符串的總長度和平均長度。
返回結果如下:SELECT SUM (LENGTH (COLUMN_VALUE)) total_length, AVG (LENGTH (COLUMN_VALUE)) average_length FROM TABLE (get_random_str (5))
total_length | average_length --------------+--------------------- 50 | 10.0000000000000000 (1 行記錄)