如何提取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>).