oracle實現split函數功能

轉載: 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;
 
相關文章
相關標籤/搜索