简体   繁体   English

Oracle 11g ExtractValue返回所有XML数据

[英]Oracle 11g ExtractValue to return all XML data

I have the following formatted XML produced using Oracle "pivot XML", ie: 我有以下使用Oracle“枢轴XML”生成的格式化XML,即:

<?xml version="1.0" encoding="UTF-8"?>
<PivotSet>
   <item>
      <column name="INTERFACE_NO">1</column>
      <column name="INTERFACE_NAME_A">abc1</column>
      <column name="INTERFACE_L">11</column>
      <column name="INTERFACE_R">22</column>
   </item>
   <item>
      <column name="INTERFACE_NO">2</column>
      <column name="INTERFACE_NAME_A">abc2</column>
      <column name="INTERFACE_L">33</column>
      <column name="INTERFACE_R">44</column>
   </item>
   <item>
      <column name="INTERFACE_NO">3</column>
      <column name="INTERFACE_NAME_A">abc3</column>
      <column name="INTERFACE_L">55</column>
      <column name="INTERFACE_R">66</column>
   </item>
   <item>
      <column name="INTERFACE_NO">4</column>
      <column name="INTERFACE_NAME_A">abc4</column>
      <column name="INTERFACE_L">77</column>
      <column name="INTERFACE_R">882</column>
   </item>
</PivotSet>

Based on the above XML, using Oracle SQL (11g) how can I extract all the values above? 基于以上XML,如何使用Oracle SQL(11g)提取以上所有值?

As an example, I've been using the following, ie 例如,我一直在使用以下内容,即

select 
        extractvalue(aggregated_interface_no_xml,'/PivotSet/item[2]/column[1]') aa,
        extractvalue(aggregated_interface_no_xml,'/PivotSet/item[2]/column[2]') bb,   
        extractvalue(aggregated_interface_no_xml,'/PivotSet/item[2]/column[3]') cc,
        extractvalue(aggregated_interface_no_xml,'/PivotSet/item[2]/column[4]') dd
from t     

but this will only return the data relating to INTERFACE_NO 2. 但这只会返回与INTERFACE_NO 2有关的数据。

I'm unsure how to pass a wildcard against /PivotSet/item to return all records within XML PivotSet, for each item? 我不确定如何针对/PivotSet/item传递通配符以返回XML PivotSet中每个项目的所有记录?

Xmlsequence is deprecated. Xmlsequence已过时。 Xmltable is good and clean method. Xmltable是一种很好且干净的方法。

select * from 
xmltable('PivotSet/item' passing 
xmltype('<PivotSet>
   <item>
      <column name="INTERFACE_NO">1</column>
      <column name="INTERFACE_NAME_A">abc1</column>
      <column name="INTERFACE_L">11</column>
      <column name="INTERFACE_R">22</column>
   </item>
   <item>
      <column name="INTERFACE_NO">2</column>
      <column name="INTERFACE_NAME_A">abc2</column>
      <column name="INTERFACE_L">33</column>
      <column name="INTERFACE_R">44</column>
   </item>
   <item>
      <column name="INTERFACE_NO">3</column>
      <column name="INTERFACE_NAME_A">abc3</column>
      <column name="INTERFACE_L">55</column>
      <column name="INTERFACE_R">66</column>
   </item>
   <item>
      <column name="INTERFACE_NO">4</column>
      <column name="INTERFACE_NAME_A">abc4</column>
      <column name="INTERFACE_L">77</column>
      <column name="INTERFACE_R">882</column>
   </item>
</PivotSet>')
columns
  row_num  FOR ORDINALITY
  ,aa  varchar2(100) path './column[1]'
  ,bb  varchar2(100) path './column[2]'
  ,cc  varchar2(100) path './column[3]'
  ,dd  varchar2(100) path './column[4]'
)

You can do this using an xml table. 您可以使用xml表执行此操作。 Something like this: 像这样:

SELECT EXTRACTVALUE(VALUE(xml_list), '//column[1]') AS interface_no
      ,EXTRACTVALUE(VALUE(xml_list), '//column[2]') AS interface_name_a
      ,EXTRACTVALUE(VALUE(xml_list), '//column[3]') AS interface_l
      ,EXTRACTVALUE(VALUE(xml_list), '//column[4]') AS interface_r
  FROM TABLE(XMLSEQUENCE(EXTRACT(XMLType('<?xml version="1.0" encoding="UTF-8"?>
<PivotSet>
   <item>
      <column name="INTERFACE_NO">1</column>
      <column name="INTERFACE_NAME_A">abc1</column>
      <column name="INTERFACE_L">11</column>
      <column name="INTERFACE_R">22</column>
   </item>
   <item>
      <column name="INTERFACE_NO">2</column>
      <column name="INTERFACE_NAME_A">abc2</column>
      <column name="INTERFACE_L">33</column>
      <column name="INTERFACE_R">44</column>
   </item>
   <item>
      <column name="INTERFACE_NO">3</column>
      <column name="INTERFACE_NAME_A">abc3</column>
      <column name="INTERFACE_L">55</column>
      <column name="INTERFACE_R">66</column>
   </item>
   <item>
      <column name="INTERFACE_NO">4</column>
      <column name="INTERFACE_NAME_A">abc4</column>
      <column name="INTERFACE_L">77</column>
      <column name="INTERFACE_R">882</column>
   </item>
</PivotSet>'), 'PivotSet/item'))) xml_list;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM