1.创建一个表类型
tabletype: create or replace type tabletype as table of VARCHAR2(32676);
2.创建split 函数
CREATE OR REPLACE FUNCTION split (p_list CLOB, p_sep VARCHAR2 := ‘,‘) RETURN tabletype PIPELINED IS /* * 2015-11-11 * Function: 返回字符串被指定字符分割后的表类型。 * Parameters: p_list: 待分割的字符串。 p_sep: 分隔符,默认逗号,也可以指定字符或字符串。 */ 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;
3.创建splitstr 函数
CREATE OR REPLACE FUNCTION splitstr (str IN CLOB, i IN INT, sep VARCHAR2 := ‘,‘) RETURN VARCHAR2 /* * 2015-11-11 * Function: 返回字符串被指定字符分割后的指定节点字符串。 * Parameters: str: 待分割的字符串。 i: 返回第几个节点。当i为0返回str中的所有字符,当i 超过可被分割的个数时返回空。 sep: 分隔符,默认逗号,也可以指定字符或字符串。当指定的分隔符不存在于str中时返回sep中的字符。 */ IS t_i NUMBER; t_count NUMBER; t_str VARCHAR2 (400); 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;
4.example
select split(‘1,2‘) from dual; select splitstr(‘abc,def‘, 2) as str from dual; select * from table (split(‘1,2‘,‘,‘));
5.参考出处
http://www.cr173.com/html/18046_1.html
时间: 2024-10-13 23:29:36