2016-04-27 86 views
0

我有以下格式化的XML使用Oracle “枢轴xml” 的生产的,即:的Oracle 11g extractValue一起返回所有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> 

基于上述XML,使用Oracle SQL(11克)如何可以提取以上所有的值?

举个例子,我一直在使用以下,即

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  

但这只会返回与INTERFACE_NO 2.

我不能确定如何将数据通过对一个通配符/PivotSet/item为每个项目返回XML PivotSet中的所有记录?

希望得到任何帮助。

谢谢。

回答

0

您可以使用xml表格来执行此操作。类似这样的:

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; 
1

Xmlsequence已弃用。 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]' 
)