oracle使用正则表达式REGEXP_SUBSTR提取XML里面的内容

使用extract(XMLTYPE(XML), ‘xphat’).getstringval()提取XML,长度过长存在报错
ORA-06502: PL/SQL: 数字或值错误 : character string buffer too small
ORA-06512: 在 “SYS.XMLTYPE”, line 169
并且存在速度较慢等问题。

正则提取XML,由于这边的XML文本中Name标签,接着的标签即为Value的值,故这样去写。其它的格式需要改正则表达式。
其中

([0-9]+(\.[0-9]{1,2})?)

为数字提取。

Result :=SUBSTR(re, 1, 4000);
Result :=substrb(Result,1,4000);

为截取4000长度的字符串。

create or replace function pyzyyhis6.mc_fn_reg_xml(reg_xml in clob,reg_name in varchar2,reg_re varchar2) return varchar2 is
  Result varchar2(20000); 
  re clob;
begin
--正则提取xml
--reg_xml   clob  传入的xml
--reg_name   varchar2 传入的节点名称
--reg_re varchar2  返回数值的正则规则(数字传"[0-9]+(\.[0-9]{1,2})?"之类的,否则传 [^<>]+)
--作者:ltd
  IF reg_re='1' then  --数字
    re := REGEXP_SUBSTR(reg_xml, '<Name>('||reg_name||')</Name><InnerValue>([0-9]+(\.[0-9]{1,2})?)</InnerValue>',1,1,'c',2);
  ELSIF  reg_re='0' then --正常数值
    re := REGEXP_SUBSTR(reg_xml, '<Name>('||reg_name||')</Name><InnerValue>([^<>]+)</InnerValue>',1,1,'c',2);
  else 
    re := REGEXP_SUBSTR(reg_xml, '<Name>('||reg_name||')</Name><InnerValue>('||reg_re||')</InnerValue>',1,1,'c',2);
  end if;
   Result :=SUBSTR(re, 1, 4000);
   Result :=substrb(Result,1,4000);
  return Result;
end;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值