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