方案一.字符串转成多行
select regexp_substr('001,002,003,004,005,006'||',', /*参数末尾加分割符*/
'[^,]+',/*正则分隔符*/
1,
rownum)
from dual
connect by rownum <= length(
regexp_replace('001,002,003,004,005,006'||',', /*参数末尾加分割符*/
'[^,]',/*正则分隔符*/
null));
方案二.定义类型集合与分割函数
/*定义 varchar2 (4000) 的 type_string_table 集合, is table of 集合即表 */
create or replace type type_string_table is table of varchar2 (4000)
/* 分割字符串函数 */
create or replace function
func_splitString(
p_str varchar2, /*需分隔的字符串 eg:'123,456,789'*/
p_sep varchar2 :=','/*分隔符*/
) return type_string_table
pipelined is idx pls_integer;
/*
分割字符串函数
返回collection
获取参考
select * from table (cast (func_splitstring ('123,456,789', ',') as type_string_table))
*/
v_string varchar2(4000) := p_str;
begin
loop
idx := instr(v_string,p_sep);
if idx>0 then
pipe row(substr(v_string,1,idx-1));
v_string := substr(v_string,idx+length(p_sep));
else
pipe row(v_string);
exit;
end if;
end loop;
end func_splitString;
方案三. 嵌入函数或存储过程使用代码段
p_str in varchar2 /*360101,360102*/
,p_sep in varchar2:=',' /*分隔符默认,*/
---------------------------------------------------------
v_str varchar2(400) := p_str;-- 数组字符串
v_item varchar2(400) := '';-- 数组字符串元素项
begin
while v_str is not null loop /*非空继续循环分割*/
if instr(v_str,p_sep)>0 then /*含有分隔符,分割*/
v_item := substr(v_str,1,instr(v_str,p_sep)-1);
v_str := substr(v_str,instr(v_str,p_sep)+1);
else /* 不含分割符,直接赋值 */
v_item:=v_str;
v_str:=null;
end if;
/* 自定义使用v_item */
end loop;