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

现在有一张表设备属地设备名称设备IP结果北京和丰中心局ME60222.83.19.109FF0000]CR56LPUF400A,210305498910J7000268,... 现在有一张表
设备属地 设备名称 设备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存储过程来实现,本人初学,不知道怎么做,麻烦哪位大佬给指点下,在线等,谢谢
展开
 我来答
海影幻
2018-09-30 · TA获得超过230个赞
知道小有建树答主
回答量:198
采纳率:75%
帮助的人:51.4万
展开全部

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

--方法

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;

效果见图:

旨丙高0O
2018-09-30
知道答主
回答量:1
采纳率:0%
帮助的人:1.3万
展开全部

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

追问
关键是数据库里不止这两条数据啊有很多的,我只是列举了这两条数据,后面很多数据怎么处理啊,大佬存储过程会不,给讲解下
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式