码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • oracle报错,XML节点值超过varchar(4000)截取方法。ORA-06502,ORA-06512,ORA-01706


      • 使用extract().getstringval()获取节点文本
      • 使用extractValue获取文本
      • 使用XMLTABLE获取节点值

    使用extract().getstringval()获取节点文本

    sql如下:

    select extract(XMLTYPE(b.XMLVALUE), '//姓名//child::text()').getstringval()
      from tab b
    
    
    • 1
    • 2
    • 3

    由于我这里的XMLVALUE是clob类型,所以先XMLTYPE(b.XMLVALUE) 是把XMLVALUE字段转为XMLTYPE类型。然后再通过extract().getstringval()获取节点文本,其中extract()得到的还是XMLTYPE类型,getstringval()则返回varchar。但是,如果内容不超过了4000,就会报错:

    ORA-06502: PL/SQL: 数字或值错误 : character string buffer too small
    ORA-06512: 在 "SYS.XMLTYPE", line 169
    查看错误堆栈的程序源?
    
    • 1
    • 2
    • 3

    使用extractValue获取文本

    使用extractValue的话,就可以一步,之前获取到节点的文本值,但是这个节点必须是末端的节点,否则就会报错。
    sql如下:

    select extractValue(XMLTYPE(b.XMLVALUE), '/EMRDoc') from tab b;
    
    • 1

    报错:
    ORA-19025: EXTRACTVALUE 只返回一个节点的值。

    正常使用extractValue获取节点值

    select extractValue(XMLTYPE(b.XMLVALUE), '/EMRDoc/xm') from tab b;
    
    • 1

    如果内容不超过了4000,同样也会报错:
    ORA-01706: 用户函数的结果值过大

    使用XMLTABLE获取节点值

    XMLTABLE()可以直接返回一个表,里面节点获取的值可以直接指定字段类型,所以就可以用clob装下超过4000文本。

    select (select NVL(dbms_lob.substr(text, 2000, 1), '99#')
              from XMLTABLE('/EMRDoc/xm' PASSING XMLTYPE(b.XMLVALUE) COLUMNS text clob PATH
                            '/EMRDoc/xm'))
      from tab b
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果需要同时获取多列,则

    select t.*,b.xm,b1.xb,b1.nl,NVL(dbms_lob.substr(b.xm, 2000, 1), '99#')
      from tab b,
           XMLTABLE('/EMRDoc' PASSING XMLTYPE(b.XMLVALUE) COLUMNS xm clob PATH
                    '/EMRDoc/xm',
                    xb clob  PATH '/EMRDoc/xb',
                    nl varchar(4000) PATH '/EMRDoc/nl') b1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    效果如下:
    在这里插入图片描述

  • 相关阅读:
    每天一个狗命小技巧:当你记住这10条Linux命令后,你就再也不会坐穿某个地方咯(狗头)
    【微服务 | 学成在线】项目易错重难点分析(媒资管理模块篇·上)
    基于深度学习的恶意软件检测
    mysql的约束和表关系
    花6000报了测试培训班,3个月后我成功“骗”进了腾讯,月薪拿17k
    换掉ES!Redis官方搜索引擎来了,性能炸裂!
    刷题-买卖股票的最佳时机-C++/java(暴力法,动态规划,单调栈等)
    推荐5款经过时间验证的神级软件
    网络取证-Tomcat-简单
    Leetcode刷题详解——扫雷游戏
  • 原文地址:https://blog.csdn.net/qq_39255840/article/details/133172943
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号