Oracle 11g的XMLtable

时间:2012-02-17 00:45:40

标签: sql xml oracle xpath oracle11g

以下是一个示例表:

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

由于

1 个答案:

答案 0 :(得分: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中应该没问题。