【问题标题】:How to import complex XML Types in Oracle SQL using XMLTABLE如何使用 XMLTABLE 在 Oracle SQL 中导入复杂的 XML 类型
【发布时间】:2015-02-07 13:35:47
【问题描述】:

我在名为 ARCHIVDATA 的表中将以下 XML 文件完全导入到一个名为 CLOB_CONTENT 的单元格中:

<AuditLog>
  <AuditLogEntry>
     <Header>1
     </Header>
     <Content>2
     </Content>
  </AuditLogEntry>
  <AuditLogEntry>
     <Header>3
     </Header>
  </AuditLogEntry>
  <AuditLogEntry>
     <Header>4
     </Header>
     <Content>5
     </Content>
     <Content>6
     </Content>
  </AuditLogEntry>
</AuditLog>

我想要的结果是下表(有两行的表):
标题 |内容
1 | 2
3 |空
4 | 5
4 | 6

我该怎么做?

我已经尝试了以下方法:

SELECT x3.header, x4.content
FROM (select xmltype(xml.CLOB_CONTENT) xmldata from ARCHIVDATA) x1,
     xmltable('/AuditLog/AuditLogEntry'
         passing x1.xmldata
         columns
             header XmlType path 'header',
             content XmlType path 'content'
         )x2,
         xmltable('/header'
         passing x2.header
         columns
             header varchar2(4000) path '.'
         )x3,
         xmltable('/content'
         passing x2.content
         columns
             content varchar2(4000) path '.'
         )x4
;/

我必须更改什么才能获得所需的结果表?

【问题讨论】:

    标签: xml oracle


    【解决方案1】:

    我用下一个查询解决了这个任务。但我确信存在更简单的方法。

    SELECT headers.header,
      contents.content
    FROM
      (SELECT extracted."Header" AS header
      FROM ARCHIVDATA a,
        xmltable('/AuditLog/AuditLogEntry' passing xmltype(a.CLOB_CONTENT) columns "Header" VARCHAR2(6) PATH '/AuditLogEntry/Header') extracted
      ) headers
    LEFT JOIN
      (SELECT sel.Header,
        sel2.content
      FROM
        (SELECT extracted."Header" AS header,
          extracted."Content"      AS content
        FROM ARCHIVDATA a,
          xmltable('/AuditLog/AuditLogEntry' passing xmltype(a.CLOB_CONTENT) columns "Header" VARCHAR2(6) PATH '/AuditLogEntry/Header', "Content" xmltype path '/AuditLogEntry') extracted
        ) sel,
        xmltable('/AuditLogEntry/Content' passing sel.content columns content VARCHAR2(6) path '/Content') sel2
      ) contents
    ON headers.header = contents.header;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 2016-04-28
      • 2017-12-06
      • 2012-09-23
      • 2020-04-29
      相关资源
      最近更新 更多