轉載: http://blog.csdn.net/jojo52013145/article/details/6758279
在實際的應用中,爲了讓PL/SQL 函數返回數據的多個行,必須經過返回一個 REF CURSOR 或一個數據集合來完成。REF CURSOR 的這種狀況侷限於能夠從查詢中選擇的數據,而整個集合在能夠返回前,必須進行具體化。 9i 經過引入的管道化表函數糾正了後一種狀況。表函數是返回整個行的集(一般做爲一個集合)的函數,能夠直接從 SQL 語句中進行查詢,就好像它是一個真正的數據庫表同樣。管道化表函數與之類似,可是它像在構建時同樣返回數據,而不是一次所有返回。管道化表函數更加有效,由於數據能夠儘量快地返回。 數據庫
管道化表函數必須返回一個集合。在函數中,PIPE ROW 語句被用來返回該集合的單個元素,該函數必須以一個空的 RETURN 語句結束,以代表它已經完成。一旦咱們建立了上述函數,咱們就能夠使用 TABLE 操做符從 SQL 查詢中調用它。函數
1. 定義一個OBJECT類型的TYPE
CREATE OR replace TYPE TY_OBJ AS OBJECT (str1 VARCHAR2(50));
2. 定義一個TYPE繼承了這個TY_OBJ;
CREATE OR replace TYPE strsplit_type AS TABLE OF TY_OBJ;
--DROP TYPE strsplit_type;
--DROP TYPE TY_OBJ;
3.測試用例:實現split函數功能oop
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(50); 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(TY_OBJ(v_str)); end loop; pipe row(TY_OBJ(v_strs_last)); RETURN; end strsplit;