如何提取 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('//orders/order' PASSING 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>).
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP