如何提取XML数据以进行关系使用?

问题陈述:

您需要从XML文档中提取单个元素值。

解:

Oracle提供XMLTABLE函数,以使用XQuery和到Oracle数据类型的列映射来操纵XML文档。使用XMLTABLE,我们可以以关系方式识别和使用XML文档中的数据元素。

让我们假设,下面的XML文档存储在我们要从中提取元素的表tmp_xml_gen中。我们拥有客户详细信息以及与订单相关的信息。

示例

<?xml version="1.0"?>
<customers>
  <customer>
    <customer_id>134</customer_id>
    <email>taylor.cauchon@internalmail</email>
    <name>Taylor Cauchon</name>
    <orders>
      <order>
        <order_id>921</order_id>
        <status>COMPLETE</status>
      </order>
      <order>
        <order_id>485</order_id>
        <status>COMPLETE</status>
      </order>
      <order>
        <order_id>1528</order_id>
        <status>COMPLETE</status>
      </order>
      <order>
        <order_id>1672</order_id>
        <status>COMPLETE</status>
      </order>
      <order>
        <order_id>1319</order_id>
        <status>COMPLETE</status>
      </order>
    </orders>
  </customer>
</customers>

WITH cust AS
-- Customer details
      (SELECT xt.customer_id,
              xt.email,
              xt.name,
              x.result
         FROM tmp_xml_gen x,
         XMLTABLE('/customers/customer' PASSING x.RESULT
                   COLUMNS
                   customer_id VARCHAR2(10)  PATH 'customer_id',
                         email VARCHAR2(255) PATH 'email',
                          name VARCHAR2(255) PATH 'name') xt),
-- Order details
     ord AS
     (SELECT customer_id,
             email,
             name,
             xt2.*
        FROM cust t,
        XMLTABLE('//订单/订单的通过t.result-
                 COLUMNS order_id VARCHAR2(4)  PATH 'order_id',
                           status VARCHAR2(10) PATH 'status' ) xt2)
SELECT * FROM ord;

输出:SQL上面的行很少

134 taylor.cauchon@internalmail Taylor Cauchon  921     COMPLETE
134 taylor.cauchon@internalmail Taylor Cauchon  485     COMPLETE
134 taylor.cauchon@internalmail Taylor Cauchon  1528    COMPLETE
134 taylor.cauchon@internalmail Taylor Cauchon  1672    COMPLETE
134 taylor.cauchon@internalmail Taylor Cauchon  1319    COMPLETE
135 marc.domanski@internalmail  Marc Domanski   50      COMPLETE
135 marc.domanski@internalmail  Marc Domanski   99      COMPLETE
135 marc.domanski@internalmail  Marc Domanski   142     COMPLETE
135 marc.domanski@internalmail  Marc Domanski   195     COMPLETE

XMLTABLE函数采用一个或多个XQuery表达式来应用于XMLTYPE数据的列或表达式。XMLTABLE的一般形式是:

xmltable(
  <XQuery to apply>,
  <Source XMLTYPE column or expression>,
  <Column definition optionally mapped with XQuery path expression>).