首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Oracle11g的XMLtable

使用Oracle11g的XMLtable
EN

Stack Overflow用户
提问于 2012-02-17 08:45:40
回答 1查看 14.8K关注 0票数 5

下面是一个示例表:

代码语言:javascript
复制
create table xmltemp (mydoc xmltype)

下面是一个小的xml文档:

代码语言:javascript
复制
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>
')
)  

请注意,加拿大没有'states‘元素,但美国有。我正在尝试获取这些查询结果(顺序和格式并不重要):

代码语言:javascript
复制
Canada,
US,Washington
US,Oregon

当我执行此命令时,我在结果中同时看到加拿大和美国:

代码语言:javascript
复制
select
countryname
from xmltemp,
xmltable('/countries/country' passing mydoc
   columns countryname varchar2(10) path 'name') 

当我这样做的时候,我得到了两种状态:

代码语言:javascript
复制
select
statename
from xmltemp,
xmltable('/countries/country/states/state/name' passing mydoc
   columns statename   varchar2(20) path '.') c

我尝试这样做是为了同时获取国家和州,但oracle似乎不喜欢'..‘语法:

代码语言:javascript
复制
select
statename
from xmltemp,
xmltable('/countries/country/states/state/name' passing mydoc
   columns statename   varchar2(20) path '.',
           countryname varchar2(20) path '../../../name') c

下面是错误:

代码语言:javascript
复制
ORA-19110: unsupported XQuery expression

当我尝试这样做时,由于以下两种状态,我得到了'multi-item‘错误:

代码语言:javascript
复制
select
countryname,
statename
from xmltemp,
xmltable('/countries/country' passing mydoc
   columns countryname varchar2(10) path 'name',
           statename   varchar2(20) path 'states/state/name') c

下面是错误:

代码语言:javascript
复制
ORA-19279: XPTY0004 - XQuery dynamic type mismatch: expected singleton 
sequence - got multi-item sequence

什么查询将使我获得所需的输出:

代码语言:javascript
复制
Canada,
US,Washington
US,Oregon

谢谢

EN

回答 1

Stack Overflow用户

发布于 2012-02-17 12:12:36

试试这个:

代码语言:javascript
复制
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中应该没问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9321391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档