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;
相关推荐
腾科IT教育1 天前
Oracle考试全解析:OCP、OCM认证体系与核心考点备考指南
数据库·oracle·开闭原则
木棉软糖3 天前
5 步确认 TiDB 历史抽数的 Logstash 有没有真的写进 ES
elasticsearch·oracle·tidb
千桐科技3 天前
qKnow智能体构建平台专业版 v3.1.5 发布:扩容工作流编排调用能力,上线Text2SQL插件,拓宽数据类智能应用构建边界
服务器·数据库·oracle·qknow
宇灬宇3 天前
oracle直方图测试
数据库·oracle
江湖中的阿龙4 天前
Oracle 紧急安全警报:Java 9.1 分漏洞 CVE-2026-91403,撤销对 eMudhra 风险证书的信任
java·安全·oracle
杨云龙UP4 天前
Oracle 同义词(SYNONYM)详解及 Toad for Oracle SQL 智能补全配置实战
运维·数据库·sql·oracle·同义词·toad·toad for oracle
loulanyue_4 天前
AI Agent记忆从不是向量库:Oracle拆解读写分离与记忆晋升门,终结无脑存聊天的伪智能——读Wojtek Pluta演讲
数据库·人工智能·oracle
Frag0ut5 天前
Notepad++ 正则表达式完全手册:文本处理的终极武器(2026实战版)
正则表达式·notepad++·数据清洗·日志分析·正则替换·提取ip·正则表达式实战
code2cat5 天前
Java工具篇之Maven:从pom.xml到测试通过的JAR
xml·java·maven