首页 > 数据库 > Oracle > 通过嵌套表返回字符串分割
使用集合构造伪表,把字符串分割后存储在嵌套表或者数据中,然后利用表函数转为伪表,然后就能正常查询,例如 select * from table(fn_strspl(in_str));
1、创建嵌套表
create or replace type strspl as table of varchar2(1000);
2、创建函数fn_strspl,分割方法多样
create or replace
function fn_strspl(in_str in varchar2,in_spl in varchar2 default ',')
return strspl --返回嵌套表
/*******************
*in_str 需要分割的字符串
*in_spl 分隔符
*******************/
as
v_str varchar2(4000) default in_str||in_spl; --构造形如'a,b,c,'
v_res strspl:=strspl(); --嵌套表需要初始化
i number;
begin
loop
exit when v_str is null;
i:=instr(v_str,in_spl);
v_res.extend;
v_res(v_res.count):=trim(substr(v_str,1,i-1));
v_str:=substr(v_str,i+1);
end loop;
return v_res;
end;
3、运行结果
select * from table(fn_strspl('a,b,c',','));
有时候还需要将分割的字符串在原来的字符串中的位置一并输出出来,这就先构造一个对象
create or replace object_type as object(rnum number,str varchar2(1000));
然后在创建嵌套表类型
create or replace type strspl2 as table of object_type;
创建函数的时候就需要将分割的字符串的位置信息一同放到嵌套表中
create or replace
function fn_strspl(in_str in varchar2,in_spl in varchar2 default ',')
return strspl2 --返回嵌套表
/*******************
*in_str 需要分割的字符串
*in_spl 分隔符
*******************/
as
v_str varchar2(4000) default in_str||in_spl; --构造形如'a,b,c,'
v_res strspl2:=strspl2(); --嵌套表需要初始化
i number;
v_num number:=1;
begin
loop
exit when v_str is null;
i:=instr(v_str,in_spl);
v_res.extend;
v_res(v_res.count):=object_type(v_num,trim(substr(v_str,1,i-1)));
v_str:=substr(v_str,i+1);
v_num:=v_num+1;
end loop;
return v_res;
end;
运行结果
select select * from table(fn_strspl('a,b,c',','));
rnum str
1 a
2 b
3 c
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30238341/viewspace-2136571/ ,如需转载,请注明出处,否则将追究法律责任。