如何在 Oracle 中從 XML 文件中提取關鍵 XML 元素?


問題陳述

你需要從 XML 文件中提取部分 / 子集元素值。

解決方案

我們可以利用支援 XMLTYPE 資料型別的 Oracle 的 EXTRACT 函式。EXTARCT 函式能夠透過返回 XMLTYPE 值來保持 XML 元素名稱和屬性結構。

假設我們有 tmp_xml_gen 表中的以下 XML,我們要從中提取客戶姓名。

示例

<?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>

SQL: 從 XML 文件中提取客戶姓名值

SELECT extract (result, '/customers/customer/customer_id').getclobval() FROM tmp_xml_gen ;

輸出:SQL 語句中的行

<customer_id>134</customer_id> <customer_id>135</customer_id> <customer_id>136</customer_id> <customer_id>137</customer_id> <customer_id>138</customer_id> <customer_id>139</customer_id> <customer_id>140</customer_id> <customer_id>141</customer_id> <customer_id>142</customer_id> <customer_id>143</customer_id> <customer_id>144</customer_id> <customer_id>145</customer_id> <customer_id>146</customer_id> <customer_id>147</customer_id>

注意:EXTRACT 函式對 XML 的操作與其對其他資料型別使用的行為不同。當用於日期或時間時,EXTRACT 只會返回請求的日期或時間部分,例如月份。如果請求月份,EXTRACT 不會返回日期或時間或任何“較小”的度量,例如天、小時等。對 XMLTYPE 資料進行操作時,EXTRACT 將返回匹配元素的巢狀級別或更低級別上的所有內容。

我們還可以使用 XMLTABLE 來提取所需資訊。

程式碼

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

更新於: 2020 年 12 月 4 日

6000+ 檢視

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.