Sql語句最好依次執行創建
/************************************** * name: split * author: sean zhang. * date: 2012-09-03. * function: 返回字符串被指定字符分割後的表類型。 * parameters: p_list: 待分割的字符串。 p_sep: 分隔符,默認逗號,也可以指定字符或字符串。 * example: select * from users where u_id in (select column_value from table (split ('1,2'))) 返回u_id為1和2的兩行數據。 **************************************/ /* 創建一個表類型 */ create or replace type tabletype as table of varchar2(32676) /* 創建 split 函數 */ create or replace function split (p_list clob, p_sep varchar2 := ',') return tabletype pipelined is l_idx pls_integer; v_list varchar2 (32676) := p_list; begin loop l_idx := instr (v_list, p_sep); if l_idx > 0 then pipe row (substr (v_list, 1, l_idx - 1)); v_list := substr (v_list, l_idx + length (p_sep)); else pipe row (v_list); exit; end if; end loop; end; /************************************** * name: splitstr * author: sean zhang. * date: 2012-09-03. * function: 返回字符串被指定字符分割後的指定節點字符串。 * parameters: str: 待分割的字符串。 i: 返回第幾個節點。當i為0返回str中的所有字符,當i 超過可被分割的個數時返回空。 sep: 分隔符,默認逗號,也可以指定字符或字符串。當指定的分隔符不存在於str中時返回sep中的字符。 * example: select splitstr('abc,def', 1) as str from dual; 得到 abc select splitstr('abc,def', 3) as str from dual; 得到 空 **************************************/ /* 創建 splitstr 函數 */ create or replace function splitstr(str in clob, i in number := 0, sep in varchar2 := ',') return varchar2 is t_i number; t_count number; t_str varchar2(4000); begin if i = 0 then t_str := str; elsif instr(str, sep) = 0 then t_str := sep; else select count(*) into t_count from table(split(str, sep)); if i <= t_count then select str into t_str from (select rownum as item, column_value as str from table(split(str, sep))) where item = i; end if; end if; return t_str; end;
select split('a,b,c,e,d,f,g') arrData from dual;
默認使用逗號分割,可以自定義修改,如:select split('X-rapido & Lemon','&') arrData from dual;
點開集合
默認使用逗號分割,可以自定義修改,如:select split('X-rapido & Lemon','&') arrData from dual;
示例:splitstr(字符串,獲取的節點下標,分隔符)
select splitstr('X-rapido&Lemon&Jennifer', 1, '&') word from dual; -- X-rapido select splitstr('X-rapido&Lemon&Jennifer', 2, '&') word from dual; -- Lemon select splitstr('X-rapido&Lemon&Jennifer', 3, '&') word from dual; -- Jennifer select splitstr('X-rapido&Lemon&Jennifer', 4, '&') word from dual; -- 空字符串