使用 Oracle 11g 的 XMLtable
Posted
技术标签:
【中文标题】使用 Oracle 11g 的 XMLtable【英文标题】:XMLtable with Oracle 11g 【发布时间】:2012-03-08 10:45:02 【问题描述】:这是一个示例表:
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】:试试这个:
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
中应该没问题。
【讨论】:
谢谢。我昨天考虑了外连接,但不太明白。尽管它们并非特定于 Oracle,但我发现这两个链接也很有帮助:[Part 1] (ibm.com/developerworks/data/library/techarticle/dm-0708nicola) [Part 2] (ibm.com/developerworks/data/library/techarticle/dm-0709nicola) 这似乎是正确的答案,因为我找不到 11g 支持 PATH 子句中任何形式的父寻址。基本上,这里所做的是将父记录加载到 XMLTABLE 中,子元素包含在该结果中的 XMLTYPE 列中。然后,使用父记录中的 XMLTYPE 子列,将子记录加载到另一个 XMLTABLE 中。然后 Oracle 隐式连接所有表。 --- 然而,我发现 11g 不能正确地与一个 (+) 进行外部连接,我必须在 x 和 y 表上都放置 (+),这没有多大意义。 我在 11g 中发现的另一个奇怪之处是,在使用默认 xmlnamespace 时,我无法按预期按特定属性处理元素。解决方法是使用通配符命名空间来处理属性(显式命名空间也不起作用)。例如,不起作用:PATH 'ID[@type="user"]'。不起作用:PATH 'ID[@foo:type="user"]'。作品:PATH 'ID[@*:type="user"]'。以上是关于使用 Oracle 11g 的 XMLtable的主要内容,如果未能解决你的问题,请参考以下文章