Oracle中怎样用存储过程将一段字符串以逗号为界截取,并将得到的子串存到另一张表中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle中怎样用存储过程将一段字符串以逗号为界截取,并将得到的子串存到另一张表中相关的知识,希望对你有一定的参考价值。

现在有一张表
设备属地 设备名称 设备IP 结果
北京 和丰中心局ME60 222.83.19.109 FF0000]CR56LPUF400A,210305498910J7000268,03054989;CR56LPUF100B0,210305377710H3000190,03053777;CR56LPUF100B0,210305377710G1000861,03053777(这是一个字段)
上海 80局华为NE80E 222.83.19.158 CR52EAGF0,0386751073000124,PIC;CR52EAGF,0278671073000167,LPU;CR52EAGF0,0386751068000350,PIC;CR52EAGF,0278671067000055,LPU;CR52SRUA0,0391091073000356,MPU;CR52SRUA0,0391091073000342,SFU
...... ......... ........... ........
其中结果这个字段很长,我只是截取了部分粘贴的,现在要将结果这个字段进行拆分,第一次拆成:
CR56LPUF400A,210305498910J7000268,03054989
CR56LPUF100B0,210305377710H3000190,03053777
CR56LPUF100B0,210305377710G1000861,03053777
第二次拆分
CR56LPUF400A 210305498910J7000268 03054989
CR56LPUF100B0 210305377710H3000190 03053777
CR56LPUF100B0 210305377710G1000861 03053777
然后将拆分的字段存到另外的一张表中表,如下
设备属地 设备名称 设备IP 单板类型 单板编码 单板描述
北京 和丰中心局ME60 222.83.19.109 CR56LPUF400A 210305498910J7000268 03054989
北京 和丰中心局ME60 222.83.19.109 CR56LPUF100B0 210305377710H3000190 03053777
北京 和丰中心局ME60 222.83.19.109 CR56LPUF100B0 210305377710G1000861 03053777
上海 80局华为NE80E 222.83.19.158 CR52EAGF0 0386751073000124 PIC
上海 80局华为NE80E 222.83.19.158 ... ... ...
... ... ... ... ... ...
现在需要使用oracle存储过程来实现,本人初学,不知道怎么做,麻烦哪位大佬给指点下,在线等,谢谢

--通过游标遍历调用方法拆取存表:

--方法

create or replace function f_test_substr(
prm1 varchar2,    --地
prm2 varchar2 ,   --名称
prm3 varchar2,    --IP
prm4 varchar2    --结果
)
return varchar2
as
v_n int:=0;  --第几次取
v_l int;  --:截取次数
v_s varchar2(2000);  --处理拆分字符串
v_s1 varchar2(200);  --本次拆分
v_s2 varchar2(200);  --本次剩余
v_type varchar2(100);  --设备类型
v_code varchar2(100);  --设备编号
v_desc varchar2(100);  --设备描述
v_errmsg varchar2(200);
begin
v_l:=length(prm4)-length(replace(prm4,';',''));
v_s:=prm4||';';
v_s1:=substr(v_s,1,instr(v_s,';',1,1));
v_s2:=replace(v_s,v_s1,'');
while v_n<=v_l loop
v_s2:=replace(v_s2,v_s1,'');
v_s1:=substr(v_s1,1,length(v_s1)-1);
v_type:=substr(v_s1,1,instr(v_s1,',',1,1)-1);
v_code:=substr(v_s1,instr(v_s1,',',1,1)+1,instr(v_s1,',',1,2)-instr(v_s1,',',1,1)-1);
v_desc:=substr(v_s1,instr(v_s1,',',1,2)+1,instr(v_s1||',',',',1,3)-instr(v_s1,',',1,2)-1);
insert into t_test_str(a,b,c,d,e,f) values(prm1,prm2,prm3,substr(v_type,instr(v_type,']',1)+1),v_code,v_desc);
v_n:=v_n+1;
v_s1:=substr(v_s2,1,instr(v_s2,';',1,1));
end loop;
commit;
return '成功';

exception
when others then
v_errmsg:=substr(sqlerrm,1,200);
return v_errmsg ;

end;

--存过

create or replace procedure p_test_substr1(o_result out varchar2)

as
v_a varchar2(20);
v_b varchar2(20);
v_c varchar2(20);
v_d varchar2(2000);
v_num int;
cursor c_str is
SELECT * from t_test_substr
;
begin
select count(1) into v_num from t_test_substr;
while v_num>0 loop
open c_str;
loop
FETCH c_str INTO
v_a,v_b,v_c,v_d;
EXIT WHEN c_str%NOTFOUND;

o_result:=f_test_substr(v_a,v_b,v_c,v_d);
v_num:=v_num-1;
end loop;
CLOSE c_str;
end loop;
end;

效果见图:

参考技术A

在过程里把处理的结果插入新表就行

追问

关键是数据库里不止这两条数据啊有很多的,我只是列举了这两条数据,后面很多数据怎么处理啊,大佬存储过程会不,给讲解下

本回答被提问者采纳

以上是关于Oracle中怎样用存储过程将一段字符串以逗号为界截取,并将得到的子串存到另一张表中的主要内容,如果未能解决你的问题,请参考以下文章

sql server里如何将一组用逗号分隔的字符串分解并插入到另一张表中,比如:11873,27827, 也可能是好多

用oracle存储过程将一张表的数据查出插入另一张表

用oracle存储过程将一张表的数据查出插入另一张表

mysql查询某数字在某字段以逗号隔开的字符里面

oracle在写存储过程时怎样将变量和字符串进行连接

oracle中PLSQL存储过程中如何使用逗号分隔的集合(逗号分隔字符串转换为一个集合)