【问题标题】:Oracle 11g ExtractValue to return all XML dataOracle 11g ExtractValue 返回所有 XML 数据
【发布时间】:2016-04-27 08:45:52
【问题描述】:

我有以下使用 Oracle“pivot 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>

基于上述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 中每个项目的所有记录?

【问题讨论】:

    标签: sql xml oracle plsql oracle11gr2


    【解决方案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]'
    )
    

    【讨论】:

      【解决方案2】:

      您可以使用 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-15
        • 1970-01-01
        • 2017-08-17
        • 1970-01-01
        • 2013-04-11
        • 1970-01-01
        • 2011-12-30
        • 2010-11-05
        相关资源
        最近更新 更多