oracle逗号分隔的数字补零,Oracle解析逗号分隔的字符串,或者01110110101此类数据...

-- 1.提取此类数据中的1的索引位置,从1开始    例: 0001100001100 --> 4,5,10,11

create or replace function hazq_instr_contains

(

v_str in varchar2

)

return varchar2

is

v_count number(10):=0;

v_char varchar2(50):=null;

strtmp varchar2(4000):=null;

v_tm varchar2(50):=null;

begin

v_count:=length(v_str);

for i in 1..v_count loop

v_char:=substr(v_str,i,1);

if (v_char = '1') then

strtmp:=strtmp || to_char(i) || ',';

end if;

if (i = v_count) then

v_tm:= length(strtmp);

strtmp:=substr(strtmp,1,v_tm-1);

end if;

end loop;

return (strtmp);

end hazq_instr_contains;

-- 2.获取指定分隔符位置的字符串

-- 将 3,5,11,88数据转换成行数据   字符串分割函数,oracle拆分字符串

create or replace function hazq_rjy_strarrayofindex

(

av_str varchar2, --要分割的字符串

av_split varchar2, --分隔符号

av_index number --取第几个元素

)

return varchar2

is

lv_str varchar2(1024);

lv_strofindex varchar2(1024);

lv_length number;

begin

lv_str:=ltrim(rtrim(av_str));

lv_str:=concat(lv_str,av_split);

lv_length:=av_index;

if lv_length=0 then

lv_strofindex:=substr(lv_str,1,instr(lv_str,av_split)-length(av_split));

else

lv_length:=av_index+1;

lv_strofindex:=substr(lv_str,instr(lv_str,av_split,1,av_index)+length(av_split),instr(lv_str,av_split,1,lv_length)-instr(lv_str,av_split,1,av_index)-length(av_split));

end if;

return lv_strofindex;

end hazq_rjy_strarrayofindex;

-- select hs_user.get_strarraystrofindex('jjfddj,33f,,ff2,i444kd',',',3) from dual; -- 这里3 是获取第4个字符串

-- 如果获取不存在的字符串,如11 返回空

-- 两个分割符连着,也是返回空

-- 3.将处理好的数据插入表中(写个游标循环,将数据插入到表中)

create or replace procedure hazq_get_roles is

v_user_id number(10);

v_branch_no number(10);

v_role_ids varchar2(1024);

v_count number(10) := 0;

cursor role_cur is select t.user_id,t.branch_no,t.role_name from hazq_rjy_tmp t;

begin

open role_cur;

loop

fetch role_cur into v_user_id,v_branch_no,v_role_ids;

if role_cur%notfound then

exit;

else

select length(regexp_replace(replace(v_role_ids,',','|'),'[^|]+','')) into v_count from dual;

-- 这种正则写法是 查询某个字符在字符串中出现的次数,可以使用上面的get_strarraylength函数代替

for i in 0..v_count loop

insert into hazq_rjy_tmp2(user_id,branch_no,role_id) values(v_user_id,v_branch_no,to_number(hazq_rjy_strarrayofindex(v_role_ids,',',i)));

end loop;

commit;

end if;

end loop;

close role_cur;

end hazq_get_roles;

附:(这个ap  可以获取分隔符分隔的字符串的个数)

create or replace function hazq_rjy_strarraylength

(

av_str varchar2, --要分割的字符串

av_split varchar2 --分隔符号

)

return number

is

lv_str varchar2(1000);

lv_length number;

begin

lv_str:=ltrim(rtrim(av_str));

lv_length:=0;

while instr(lv_str,av_split)<>0 loop

lv_length:=lv_length+1;

lv_str:=substr(lv_str,instr(lv_str,av_split)+length(av_split),length(lv_str));

end loop;

lv_length:=lv_length+1;

return lv_length;

end hazq_rjy_strarraylength;

-- select hs_user.get_strarraylength('jjfddj,33f,,ff2,i444kd',',') from dual; -- 5 获取到,分割的字符串个数。

-- 没有, 则返回1

码字不易,转发请标明出处^_^     https://www.cnblogs.com/junyouren/p/11936517.html

下面是sql学习交流群,欢迎有兴趣的朋友加入交流学习!!

合肥sql交流群:703978998

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值