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
感謝
謝謝。昨天我考慮了外部聯盟,但無法弄清楚。雖然他們不是特定於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
這似乎是正確的答案,因爲我無法找到11g支持PATH子句中的任何形式的父地址。基本上,這裏所做的是將父記錄加載到XMLTABLE中,其中的子元素包含在該結果的XMLTYPE列中。然後,使用父記錄中的XMLTYPE子列,將子記錄加載到另一個XMLTABLE中。 Oracle然後隱式地加入所有表。 ---然而我發現,11g並不是只用一個(+)就可以正確連接,我必須把(+)放在x和y表中,這沒有多大意義。 – juanitogan 2013-06-29 18:28:28
我在11g中發現的另一個奇怪之處在於,當使用默認的xmlnamespace時,我無法按照預期的方式使用特定的屬性來處理元素。解決方法是使用通配符名稱空間來解決該屬性(顯式名稱空間也不起作用)。例如,不起作用:PATH'ID [@ type =「user」]'。無效:PATH'ID [@foo:type =「user」]'。Works:PATH'ID [@ *:type =「user」]'。 – juanitogan 2013-06-29 18:41:36