CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000)
CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN ty_str_split
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
str_split ty_str_split := ty_str_split ();
BEGIN
len := LENGTH (p_str);
len1 := LENGTH (p_delimiter);
WHILE j < len
LOOP
j := INSTR (p_str, p_delimiter, i);
IF j = 0
THEN
j := len;
str := SUBSTR (p_str, i);
str_split.EXTEND;
str_split (str_split.COUNT) := str;
IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j - i);
i := j + len1;
str_split.EXTEND;
str_split (str_split.COUNT) := str;
END IF;
END LOOP;
RETURN str_split;
END fn_split;
---test
select t.column_value,rownum row_ from
table(
cast (
fn_split ('1,2,3,4,5,,7,,', ',') as ty_str_split
)
) t
-------------********************************************************
/*
* name: splitstr (字符串,获取的节点下标,分隔符)
* author: mmm.
* 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(fn_split(str, sep));
if i <= t_count then
select str
into t_str
from (select rownum as item, column_value as str
from table(fn_split(str, sep)))
where item = i;
end if;
end if;
return t_str;
end;
----------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; -- 空字符串
select splitstr(b.group_no1,1,'#') from bms_fee_data_view b where b.be_income = 0