【问题标题】:ORA-19025: EXTRACTVALUE returns value of only one nodeORA-19025: EXTRACTVALUE 仅返回一个节点的值
【发布时间】:2022-01-21 05:22:03
【问题描述】:

我可以成功读取只有一个节点的 xml 定义。但是当我尝试从 xml 定义中读取多个节点时,我收到以下错误 -

ORA-19025:EXTRACTVALUE 仅返回一个节点的值。

下面是我的xml定义

<form xmlns:fr="http://orbeon.org/oxf/xml/form-runner" fr:data-format-version="4.0.0">
    <applicant>
        <userId>1234</userId>
        <userName>Dan Johnson</userName>
        <userEmail>johnson.dan@test.com</userEmail>                                            
    </applicant>       
    <background>
        <additionalDuties>Nothing</additionalDuties>
           <grid-7>
            <position>Service desk analyst</position>
            <workplace>Chicago</workplace>
            <date>1234</date>
            <duties>NA</duties>
           </grid-7>
           <grid-7>
             <position>Service desk analyst 1</position>
             <workplace>New york</workplace>
             <date>123123</date>
             <duties>NA</duties>
           </grid-7>
    </background>
</form>

SQL 查询

SELECT extractvalue(xml, '//*/userId/text()') AS "E-number",
       extractvalue(xml, '//*/userName/text()') AS "Name",
       extractvalue(xml, '//*/userEmail/text()') AS "Email",
       extractvalue(xml, '//*/additionalDuties/text()') AS "Responsibilities",
       extractvalue(xml, '//*/position/text()') AS "Position",
       extractvalue(xml, '//*/workplace/text()') AS "Workplace",
       extractvalue(xml, '//*/date/text()') AS "Date",
       extractvalue(xml, '//*/duties/text()') AS "Duties"
  FROM form_data fd
 WHERE form = 'form-name'

【问题讨论】:

标签: sql xml oracle xml-parsing


【解决方案1】:

你可以使用XMLTABLE:

SELECT x.*
FROM   table_name t
       CROSS JOIN XMLTABLE(
         '/form/background/grid-7'
         PASSING XMLTYPE(xml)
         COLUMNS
           "E-number"         NUMBER        PATH './../../applicant/userId',     
           "Name"             VARCHAR2(150) PATH './../../applicant/userName',
           "Email"            VARCHAR2(150) PATH './../../applicant/userEmail',
           "Responsibilities" VARCHAR2(150) PATH './../additionalDuties',
           "Position"         VARCHAR2(150) PATH 'position',
           "Workplace"        VARCHAR2(150) PATH 'workplace',
           "Date"             NUMBER        PATH 'date',
           "Duties"           VARCHAR2(150) PATH 'duties' 
        ) x

其中,对于样本数据:

CREATE TABLE table_name (xml) AS
SELECT TO_CLOB('<form xmlns:fr="http://orbeon.org/oxf/xml/form-runner" fr:data-format-version="4.0.0">
    <applicant>
        <userId>1234</userId>
        <userName>Dan Johnson</userName>
        <userEmail>johnson.dan@test.com</userEmail>                                            
    </applicant>       
    <background>
        <additionalDuties>Nothing</additionalDuties>
        <grid-7>
            <position>Service desk analyst</position>
            <workplace>Chicago</workplace>
            <date>1234</date>
            <duties>NA</duties>
        </grid-7>
        <grid-7>
             <position>Service desk analyst 1</position>
             <workplace>New york</workplace>
             <date>123123</date>
             <duties>NA</duties>
        </grid-7>
    </background>
</form>') FROM DUAL

输出:

E-number Name Email Responsibilities Position Workplace Date Duties
1234 Dan Johnson johnson.dan@test.com Nothing Service desk analyst Chicago 1234 NA
1234 Dan Johnson johnson.dan@test.com Nothing Service desk analyst 1 New york 123123 NA

db小提琴here

【讨论】:

    【解决方案2】:

    您可以使用Oracle推荐的XMLTABLE,而不是不推荐使用的函数EXTRACTVALUE,例如

    WITH form_data( xml ) AS
    (
     SELECT XMLType(
              REPLACE(
                      '<form xmlns:fr="http://orbeon.org/oxf/xml/form-runner" fr:data-format-version="4.0.0">
                             the rest of your XML is embedded here
                       </form>','grid-','grid')
              )
       FROM dual
    )
    SELECT "E-number", "Name", "Email", "Responsibilities", 
           "Position", "Workplace","Date","Duties"
      FROM form_data,
      XMLTABLE('/form/applicant'
          PASSING xml
          COLUMNS 
                 "E-number" VARCHAR2(150) PATH 'userId',
                 "Name"     VARCHAR2(150) PATH 'userName',
                 "Email"    VARCHAR2(150) PATH 'userEmail'
             ),
      XMLTABLE('/form/background/grid7'
          PASSING xml
          COLUMNS          
                 "Responsibilities" VARCHAR2(150) PATH 'duties',
                 "Position"         VARCHAR2(150) PATH 'position',
                 "Workplace"        VARCHAR2(150) PATH 'workplace',
                 "Date"             VARCHAR2(150) PATH 'date',
                 "Duties"           VARCHAR2(150) PATH 'duties' 
             )   
    

    Demo

    【讨论】:

      猜你喜欢
      • 2020-11-20
      • 2014-12-06
      • 2021-03-20
      • 2016-12-31
      • 2017-11-03
      • 2012-03-18
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多