2013-02-19 32 views
0

我目前正在Oracle 11g中使用Oracle PL/SQL。 我有兩種從我工作的XML。將與PL/SQL相同級別的兩個節點關聯起來

下面是我迄今爲止完成的兩種類型的XML和提取的示例。

TYPE 1 XML:

<ListItens1 xmlns=「xpto」> 
<item id=」1」> 
    <product type=」fruit」> 
     <model> Apple </model> 
     <date>02/19/2013</date> 
     <year>2013</year> 
    </product> 
</item > 
<item id=」2」> 
    <product type=」notebook」> 
     <model> Vostro </model> 
     <date>02/19/2013</date> 
     <year> 2013 </year> 
    </product> 
</item> 
</ListItens1> 

TYPE 2 XML:

<ListItens2 xmlns=「xpto」> 
<item>1</item> 
<product type=」fruit」> 
    <model> Apple </model> 
    <date>02/19/2013</date> 
    <year>2013</year> 
</product> 
<item>2</item> 
<product type=」notebook」> 
    <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; 

它導致:

​​

但對於2型我不不知道如何處理ITEM和PRODUCT之間的關聯,因爲它們在XML中處於相同的層次結構級別。

可以在不修改XML的情況下提取與項目關聯的產品數據?

回答

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); 
相關問題