2016-04-27 4 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 (11g), как я могу извлечь все значения выше?

В качестве примера, я использую следующий, т.е.

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]' 
)