2012-02-17 116 views
5

下面是一個示例表:XMLTABLE用的Oracle 11g

create table xmltemp (mydoc xmltype) 

這裏是它的一個小的XML文檔:

insert into xmltemp values (
xmltype 
('<?xml version="1.0"?> 
<countries> 
    <country> 
    <name>Canada</name> 
    </country> 
    <country> 
    <name>US</name> 
    <states> 
     <state> 
     <name>Washington</name> 
     <name>Oregon</name>   
     </state> 
    </states> 
    </country> 
</countries> 
') 
) 

注意,加拿大沒有一個「國家」元素,但美國確實。 我試圖讓這些查詢結果(順序和格式並不重要):

Canada, 
US,Washington 
US,Oregon 

當我執行此,我同時看到加拿大和美國的結果:

select 
countryname 
from xmltemp, 
xmltable('/countries/country' passing mydoc 
    columns countryname varchar2(10) path 'name') 

當我這樣做,我得到這兩種狀態:

select 
statename 
from xmltemp, 
xmltable('/countries/country/states/state/name' passing mydoc 
    columns statename varchar2(20) path '.') c 

我想這同時獲得國家和狀態,但似乎Oracle不喜歡「..」語法:

select 
statename 
from xmltemp, 
xmltable('/countries/country/states/state/name' passing mydoc 
    columns statename varchar2(20) path '.', 
      countryname varchar2(20) path '../../../name') c 

繼承人的錯誤:

ORA-19110: unsupported XQuery expression 

當我嘗試,我得到,因爲這兩個國家的 '多項目' 的錯誤:

select 
countryname, 
statename 
from xmltemp, 
xmltable('/countries/country' passing mydoc 
    columns countryname varchar2(10) path 'name', 
      statename varchar2(20) path 'states/state/name') c 

這裏是一個錯誤:

ORA-19279: XPTY0004 - XQuery dynamic type mismatch: expected singleton 
sequence - got multi-item sequence 

什麼是一個查詢,將得到我想要的輸出:

Canada, 
US,Washington 
US,Oregon 

感謝

回答

4

試試這個:

select  X.COUNTRYNAME, Y.STATENAME 
from  XMLTEMP 
      ,xmltable('/countries/country' 
        passing MYDOC 
        columns COUNTRYNAME varchar2(20) path './name', 
          STATES xmltype path './states') X, 
      xmltable('/states/state/name' passing X.STATES 
        columns STATENAME varchar2(20) path '.') (+) Y 

因爲你有多個狀態,你應該加入到另一個XML表。由於有些國家沒有國家,所以它需要成爲一個左外連接。我正在使用舊方法(+),因爲我在10g上試了這個,看起來在10g中使用left outer join存在問題,但顯然在11g中應該沒問題。

+0

謝謝。昨天我考慮了外部聯盟,但無法弄清楚。雖然他們不是特定於Oracle,但我發現這兩個鏈接也很有用:[第1部分](http://www.ibm.com/developerworks/data/library/techarticle/dm-0708nicola/)[第2部分](http ://www.ibm.com/developerworks/data/library/techarticle/dm-0709nicola/) – John 2012-02-17 16:01:37

+1

這似乎是正確的答案,因爲我無法找到11g支持PATH子句中的任何形式的父地址。基本上,這裏所做的是將父記錄加載到XMLTABLE中,其中的子元素包含在該結果的XMLTYPE列中。然後,使用父記錄中的XMLTYPE子列,將子記錄加載到另一個XMLTABLE中。 Oracle然後隱式地加入所有表。 ---然而我發現,11g並不是只用一個(+)就可以正確連接,我必須把(+)放在x和y表中,這沒有多大意義。 – juanitogan 2013-06-29 18:28:28

+0

我在11g中發現的另一個奇怪之處在於,當使用默認的xmlnamespace時,我無法按照預期的方式使用特定的屬性來處理元素。解決方法是使用通配符名稱空間來解決該屬性(顯式名稱空間也不起作用)。例如,不起作用:PATH'ID [@ type =「user」]'。無效:PATH'ID [@foo:type =「user」]'。Works:PATH'ID [@ *:type =「user」]'。 – juanitogan 2013-06-29 18:41:36