2012-02-17 90 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