字符串“a-b-c-d”变成4行记录
SQL> SELECT * FROM f_fun('a-b-c-d');
COLUMN_VALUE
--------------------------------------------------------------------------------
a
b
c
d
4行记录转变成字符串
f
--------------------------------------------------------------------------------
a
b
c
d
转换成:a-b-c-d
SQL> SELECT * FROM f_fun('a-b-c-d');
COLUMN_VALUE
--------------------------------------------------------------------------------
a
b
c
d
4行记录转变成字符串
f
--------------------------------------------------------------------------------
a
b
c
d
转换成:a-b-c-d
is
--declare
posion int;
maxTimes int;
temp varchar2(1000);
--splitString varchar2(1000) := 'a,bb,ccc,dddd,eeeee';
--separator varchar2(10) := ',';
begin
maxTimes := 0;
temp := splitString;
loop
exit when instr(temp,separator)<=0;
maxTimes := maxTimes + 1;
posion := instr(temp,separator);
--dbms_output.put_line(to_char(posion));
temp := substr(temp, posion + 1);
--dbms_output.put_line(temp);
end loop;
--dbms_output.put_line('-----start-----');
for splitList in (select regexp_substr(splitString, '[^' || separator || ']+', 1, level) as splitResult from dual connect by level <= maxTimes + 1) loop
dbms_output.put_line(splitList.splitResult);
end loop;
end;
--使用
begin
pro_splitWithSeparator('a,bb,ccc,dddd,eeeee',',');
end;--结果
--我写的PROCEDURE是没有返回值的,直接打印。如果需要返回数组,需要则添加新的OUT参数
a
bb
ccc
dddd
eeeee
--第二个问题,灵活性太强了,写成PROCEDURE还不好用些,直接用SQL语句吧
select replace(wm_concat(字段名称),',','-') from 表名
--如果有分组字段则需要添加下一行分组代码
--select 分组字段,replace(wm_concat(字段名称),',','-') from 表名
--group by 分组字段