0

現在、Oracle11gでOraclePL/SQLを使用しています。私は2種類のXMLを使用しています。

2種類のXMLのサンプルと、これまでに行った抽出に続いて。

タイプ1XML:

<ListItens1 xmlns=“xpto”&gt;
<item id=”1”&gt;
    <product type=”fruit”&gt;
        <model> Apple </model>
        <date>02/19/2013</date>
        <year>2013</year>
    </product>
</item >
<item id=”2”&gt;
    <product type=”notebook”&gt;
        <model> Vostro </model>
        <date>02/19/2013</date>
        <year> 2013 </year>
    </product>
</item>
</ListItens1>

タイプ2XML:

<ListItens2 xmlns=“xpto”&gt;
 <item>1</item>
 <product type=”fruit”&gt;
    <model> Apple </model>
    <date>02/19/2013</date>
    <year>2013</year>
 </product>
 <item>2</item>
 <product type=”notebook”&gt;
    <model> Vostro </model>
    <date>02/19/2013</date>
    <year> 2013 </year>
 </product>
<ListItens2>

これらのXMLは、タイプXMLTYPEのアーカイブと呼ばれるフィールドを持つテーブルに挿入されています。

CREATE TABLE XML_PRODUCT ( ID_XML NUMBER, DATA DATE, ARCHIVE XMLType);

XMLがタイプ1の場合、私はこのように問題なく実行しています。

SELECT 
  ExtractValue( value( NFe ) , '/item/@id', 'xmlns="xpto' ) ID,
  ExtractValue( value( NFe ) , '/item/product/@type', 'xmlns="xpto' ) TYPE,
  ExtractValue( value( NFe ) , '/item/product/model', 'xmlns="xpto' ) MODEL,
  ExtractValue( value( NFe ) , '/item/product/date'', 'xmlns="xpto' ) DATE,
  ExtractValue( value( NFe ) , '/item/product/year'', 'xmlns="xpto' ) YEAR,
FROM XML_PRODUCT,
  TABLE( XMLSequence( Extract ( ARCHIVE,  '/listItens1/item', 'xpto' ) ) ) NFe
WHERE ID_XML = 1;

結果は次のようになります。

 ID |  TYPE     | MODEL  |    DATE    | YEAR 
-----------------------------------------------
 1  |  fruit    | Apple  | 02/19/2013 | 2013   
 2  |  notebook | Vostro | 02/19/2013 | 2013  

しかし、タイプ2の場合、アイテムと製品はXMLの同じ階層レベルにあるため、それらを関連付ける方法がわかりません。

XMLを変更せずに、アイテムに関連付けられている製品データを抽出することは可能ですか?

4

1 に答える 1

1

最初にアイテム数を抽出してから、そこから製品の発生を取得できます。

select id_xml, 
       extractvalue(xml, '/item['||r||']', 'xmlns="xpto"' ) item,
       extractvalue(xml, '/product['||r||']/@type', 'xmlns="xpto"' ) type,
       extractvalue( xml , '/product['||r||']/model', 'xmlns="xpto"' ) model,
       extractvalue(xml , '/product['||r||']/date', 'xmlns="xpto"' ) dte,
       extractvalue( xml , '/product['||r||']/year', 'xmlns="xpto"' ) year
  from (select id_xml, extract(archive, '/ListItens2/*', 'xmlns="xpto"') xml, rownum r
           from xml_product,
                table(xmlsequence(extract(archive, '/ListItens2/item', 'xmlns="xpto"'))) nfe
          where id_xml = xxx);
于 2013-02-27T14:05:39.880 に答える