為了讓 PL/SQL 函數返回資料的多個行,必須通過返回一個 REF CURSOR 或一個資料集合來完成。REF CURSOR 的這種情況局限於可以從查詢中選擇的資料,而整個集合在可以返回前,必須進行具體化。Oracle 9i 通過引入的管道化表函數糾正了後一種情況。表函數是返回整個行的集(通常作為一個集合)的函數,可以直接從 SQL 陳述式中進行查詢,就好像它是一個真正的資料庫表一樣。管道化表函數與之相似,但是它像在構建時一樣返回資料,而不是一次全部返回。管道化表函數更加有效,因為資料可以儘可能快地返回。
管道化表函數必須返回一個集合。在函數中,PIPE ROW 語句被用來返回該集合的單個元素,該函數必須以一個空的 RETURN 語句結束,以表明它已經完成。一旦我們建立了上述函數,我們就可以使用 TABLE 操作符從 SQL 查詢中調用它。
管道化表函數經常被用來把資料從一種類型轉化成另一種類型。
create or replace function strsplit(p_value varchar2, p_split varchar2 := ',')--usage: select * from table(strsplit('1,2,3,4,5')) return strsplit_type pipelined is v_idx integer; v_str varchar2(500); v_strs_last varchar2(4000) := p_value;begin loop v_idx := instr(v_strs_last, p_split); exit when v_idx = 0; v_str := substr(v_strs_last, 1, v_idx - 1); v_strs_last := substr(v_strs_last, v_idx + 1); pipe row(v_str); end loop; pipe row(v_strs_last); return;end strsplit;
usage: select * from table(strsplit('1,2,3,4,5'))
1 1
22
33
44
55