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

qq_41832622 2018-09-29 05:15:45
现在有一张表
设备属地 设备名称 设备IP 结果
北京 和丰中心局ME60(是一个字段) 222.83.19.109 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存储过程来实现,本人初学,不知道怎么做,麻烦哪位大佬给指点下,在线等,谢谢
...全文
681 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
SELECT regexp_substr('CR56LPUF400A,210305498910J7000268,03054989;CR56LPUF100B0,210305377710H3000190,03053777;CR56LPUF100B0,210305377710G1000861,03053777', '[^(;|,)]+', 1, LEVEL)
FROM dual
CONNECT BY level<=regexp_count(column,'(;|,)]')+1
此处的(;|,) 不知是否可行,楼主可以用两次正则替换
谁是蜗壳儿 2018-10-10
  • 打赏
  • 举报
回复
写一个spilt函数,参考
create or replace function split(p_str varchar2,p_delimiter varchar2 default ',') return type_str

is

rs type_str:=type_str();

l_str varchar2(4000):='';

l_len number:=0;

begin

l_str:=p_str;

l_len:=length(p_delimiter);

while length(l_str)>0 loop

if instr(l_str,p_delimiter)>0 then

rs.extend;

rs(rs.count):=substr(l_str,1,instr(l_str,p_delimiter)-1);

l_str:=substr(l_str,instr(l_str,p_delimiter)+l_len);

else

rs.extend;

rs(rs.count):=l_str;

exit;

end if;

end loop;

return rs;

end;
oraclemaoyu 2018-10-09
  • 打赏
  • 举报
回复
SELECT regexp_substr('CR56LPUF400A,210305498910J7000268,03054989;CR56LPUF100B0,210305377710H3000190,03053777;CR56LPUF100B0,210305377710G1000861,03053777', '[^;,]+', 1, LEVEL)
FROM dual
CONNECT BY regexp_substr('CR56LPUF400A,210305498910J7000268,03054989;CR56LPUF100B0,210305377710H3000190,03053777;CR56LPUF100B0,210305377710G1000861,03053777', '[^;,]+', 1, LEVEL) IS NOT NULL
Mricoo_周 2018-10-08
  • 打赏
  • 举报
回复
你可以用instr函数+substr函数来帮你解决这个问题
Mricoo_周 2018-10-08
  • 打赏
  • 举报
回复
引用 2 楼 weixin_41637486 的回复:
你可以用instr函数+substr函数来帮你解决这个问题
先用split函数,根据’;‘把数据切割成多行,然后再根据instr+substr 把一个字段分割成多个字段
ckc 2018-10-03
  • 打赏
  • 举报
回复
实际上就是按分号拆分一次,再按逗号拆分一次吧
拆分可以用connect by配合REGEXP_SUBSTR ,很麻烦
似乎还有其它一些奇技淫巧
这种事情我建议别放在存储过程里做,即难写又难维护
用个外部脚本,难度就降低很多,维护起来也容易

17,078

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧