您的位置:首页 > 数据库 > Oracle

一个用作撕碎字符串的PL/SQL工具函数(Oracle 10g)

2012-06-20 19:12 417 查看
create or replace function f_tool_splt2arr(p_src     in varchar2,
p_sub     in varchar2 default ',',
p_regflag in number default 0)
return dbms_utility.lname_array is
/***********************************************************************
将字符串撕成碎片,以数组的形式返回,支持正则表达式方式撕碎
作者:xxx
日期:2012年6月20日
参数:
in
p_src       输入的待撕碎字符串
p_sub       用于撕碎的定位子串
p_regflag   是否启用正规表示式方式撕碎,0_不启用,1_启用
返回值:
v_retarr    返回撕碎后的数组,可用作调用者迭代
***********************************************************************/
v_retarr dbms_utility.lname_array;
c_pos    number := 0;
p_pos    number := 1;
ind      number := 1;
begin
if p_regflag = 0 then
while instr(p_src, p_sub, p_pos, 1) > 1 loop
c_pos := instr(p_src, p_sub, p_pos, 1);
v_retarr(ind) := substr(p_src,
p_pos,
c_pos - p_pos - length(p_sub) + 1);
p_pos := c_pos + length(p_sub);
ind := ind + 1;
end loop;
v_retarr(ind) := substr(p_src, p_pos);
else
while regexp_instr(p_src, p_sub, p_pos, 1, 0) > 1 loop
c_pos := regexp_instr(p_src, p_sub, p_pos, 1, 0);
v_retarr(ind) := substr(p_src, p_pos, c_pos - p_pos);
p_pos := regexp_instr(p_src, p_sub, p_pos, 1, 1);
ind := ind + 1;
end loop;
v_retarr(ind) := substr(p_src, p_pos);
end if;
return v_retarr;
end f_tool_splt2arr;

调用示例

declare
a dbms_utility.lname_array;
begin
a := f_tool_splt2arr('abc123sdjfk88dkjff9kjkj123123mmmm','[0-9]+',1);
for i in a.first .. a.last loop
dbms_output.put_line(i);
dbms_output.put_line(a(i));
end loop;
end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: