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;
相关推荐
潘潘的嵌入式日记9 小时前
改完Keil工程文件被缓存覆盖?——uvprojx编辑的进阶四坑
xml·嵌入式·keil·调试·mdk·工程文件
Full Stack Developme15 小时前
Flowable XML标签大全
xml
踏月的造梦星球16 小时前
DMHS同步原理与DM8到DM8基础搭建
数据库·oracle
微三云 - 廖会灵 (私域系统开发)17 小时前
电商系统监控告警体系从0到1:Prometheus+Grafana+AlertManager的全链路可观测性实践
oracle·grafana·prometheus
G.O.G.O.G18 小时前
LeetCode SQL 从入门到精通(MySQL)05(下)
数据库·sql·oracle
alxraves20 小时前
医院远程会诊系统:数据库模块设计与实现
数据库·oracle
苦瓜汤补钙20 小时前
Oracle JDK8 环境配置-Win11
开发语言·数据库·笔记·oracle
️学习的小王21 小时前
MySQL 数据库基础操作全解:从建库到增删改查
数据库·mysql·oracle
oradh21 小时前
Oracle 11g单库升级至19c单库(dbua图形方式)
数据库·oracle·11g升级19c·dbua升级方式
Java面试题总结1 天前
RAG 入库实战:一份原始资料,如何变成可检索的知识
数据库·oracle