【问题标题】:Extract node value for Oracle Clob提取 Oracle Clob 的节点值
【发布时间】:2017-11-08 19:17:51
【问题描述】:

我有一个 CLOB 列,其中包含 XML 样式的数据,尽管它似乎没有父子节点关系;它看起来像这样:

<servicePointExternalId>8629391888</servicePointExternalId><externalSPType>E-M-COM</externalSPType><faType>M-STARTS</faType><requesterUserId>E05920</requesterUserId><replyToExternalSystem>D1YS</replyToExternalSystem><externalReferenceId>47676141503102</externalReferenceId><retryDetails><numberOfRetries>0</numberOfRetries><isToDoEntrySuppressed>false</isToDoEntrySuppressed><retryDateTime>2017-04-28-18.16.53</retryDateTime><currentErrorState>VALERROR</currentErrorState></retryDetails><contactDetails><customerName>Hofstader, Leonard</customerName><contactName>Hofstader, Leonard</contactName><accountId>5669202300</accountId><personId>9538791588</personId></contactDetails><saList><eventType>D1ST</eventType><saId>5668577181</saId></saList>

我正在尝试从该字段中提取 requesteruserID 值(应该是 E05920),我收到以下错误消息:

ORA-31011: XML parsing failed
ORA-19213: error occurred in XML processing at lines 1
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.

我做错了什么?

【问题讨论】:

    标签: xml oracle clob


    【解决方案1】:

    您的示例不是完整的 XML 文档 - 它没有父节点,只有相邻的子节点。

    如果要将其视为 XML,则需要将其包装在虚拟根节点中,例如如果您的 CLOB 在名为 clob_col 的列中,您可以这样做:

    xmltype(to_clob('<root>') || clob_col || '</root>')
    

    要获得您想要的特定节点值,您可以这样做:

    select xmlquery(
      '/root/requesterUserId/text()'
      passing xmltype(to_clob('<root>') || clob_col || '</root>')
      returning content) as result
    from your_table;
    
    RESULT                                                                          
    --------------------------------------------------------------------------------
    E05920
    

    或者使用您作为评论添加的表和列名称:

    select xmlquery(
      '/root/requesterUserId/text()'
      passing xmltype(to_clob('<root>') || A.BO_DATA_AREA || '</root>')
      returning content) as result
    from CISADM.D1_ACTIVITY A
    

    或者只是

    select xmlquery(
      '/root/requesterUserId/text()'
      passing xmltype('<root>' || A.BO_DATA_AREA || '</root>')
      returning content) as result
    from CISADM.D1_ACTIVITY A
    

    您可以将返回的 XML 片段转换为另一种数据类型:

    select cast(
      xmlquery( '/root/requesterUserId/text()'
        passing xmltype(to_clob('<root>') || A.BO_DATA_AREA|| '</root>')
        returning content)
      as varchar2(8)) as requesterUserId
    from CISADM.D1_ACTIVITY A;
    

    或者您也可以使用XMLTable 代替XMLQuery

    select x.requesterUserId
    from CISADM.D1_ACTIVITY A
    cross join xmltable(
      '/root'
      passing xmltype('<root>' || A.BO_DATA_AREA || '</root>')
      columns requesterUserId varchar2(8) path 'requesterUserId'
    ) x;
    

    其中任何一个都给出纯字符串值:

    REQUESTE
    --------
    E05920
    

    Read more about XML processing.

    【讨论】:

    • 非常感谢您的回答,根据您的回答,我的代码应该是这样的。选择 xmlquery('/root/requesterUserId/text()' 传递 xmltype(A.BO_DATA_AREA('') || A.BO_DATA_AREA|| '') 返回内容)作为 CISADM.D1_ACTIVITY A 的结果;我仍然收到此错误: ORA-00904: "A"."BO_DATA_AREA": invalid identifier 00904. 00000 - "%s: invalid identifier" *原因:*操作:
    • 你有点搞砸了; A.BO_DATA_AREA('&lt;root&gt;') 应该是 to_clob('&lt;root&gt;')。 (to_clob() 是为了确保连接运算符的第一个参数是clobthough that isn't really necessary。)
    • 啊,开枪,对不起,我以为您的意思是 TO_CLOB 作为实际列的占位符,抱歉这个错误。不管 ORA-00904: "TO_CLOB": invalid identifier 00904. 00000 - "%s: invalid identifier" *Cause: *Action: Thinking it a column or something,它似乎都会产生同样的错误。嘿,顺便说一下,感谢您的快速回答 - 非常感谢您的帮助!
    • 这是一个函数,而不是一个列,不知道为什么它不可用?不过你不需要它,只需使用纯字符串即可。
    • 这肯定越来越近了——我终于让它成功运行了,但是它返回给我一个名为“Result”的列,并且值是 (XMLTYPE) 而不是来自 clob 的实际值。
    猜你喜欢
    • 2012-11-26
    • 2016-10-16
    • 2018-10-21
    • 2013-09-06
    • 2019-12-20
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    相关资源
    最近更新 更多