【问题标题】:oracle sql - xmltype for extracing xml value not workingoracle sql - 用于提取 xml 值的 xmltype 不起作用
【发布时间】:2017-03-23 10:54:00
【问题描述】:

我的 clob 字段中有以下 xml:

<i>7894564</i>
<se>ABC</se>

我正在使用以下查询,但它会产生错误:

select xmltype(clob_field).extract('//se/text()').getStringVal() from tablename

错误是:

ORA-31011: XML parsing failed
ORA-19213: error occurred in XML processing at lines 2
LPX-00245: extra data after end of document
ORA-06512: at "SYS.XMLTYPE", line 272
ORA-06512: at line 1
31011. 00000 -  "XML parsing failed"
*Cause:    XML parser returned an error while trying to parse the document.
*Action:   Check if the document to be parsed is valid.

谁能帮我解决这个问题?提前致谢

【问题讨论】:

    标签: sql xml oracle xmltype


    【解决方案1】:

    您的问题是存储在 CLOB 中的不是 XML 文档,因为它缺少根节点。由于您正在扫描提取中的整个文档,因此您可以将其包装在一个元素中以确保您有 1 个且只有 1 个根,此时您的 XMLTYPE 转换将起作用。


    有点脏但是:

    SELECT
      XMLTYPE('<ROOT>'||clob_field||'</ROOT>').EXTRACT('//se/text()').getStringVal()
    FROM tablename
    

    【讨论】:

    • 顺便提一下:在这种情况下可能没问题,但应该避免使用// 进行深度搜索。更好的是EXTRACT('/ROOT/se/text()')
    • 这是一个很好的观点。我通常会指导人们仅在您确实需要搜索整个文档时才使用 //。至少在使用 // 之前尝试尽可能靠近本地化,这样您就可以搜索更小的空间。
    【解决方案2】:

    试试这个:

    这应该可以工作

      with xml_table
      as
      (
      select '<i>7894564</i>' xml_data from dual
      union
      select '<se>ABC</se>' xml_data from dual  
      )
      select xmltype(xml_data).extract('//se/text()').getStringVal() from xml_table
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 2014-07-22
      • 2019-08-19
      • 2021-05-13
      • 1970-01-01
      相关资源
      最近更新 更多