使用 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的主要内容,如果未能解决你的问题,请参考以下文章

哪个Oracle 11g有DBCA?

Oracle 11g - 使用 RegEx 检查约束

使用 Oracle 11g 客户端连接到 Oracle 19C 服务器

Oracle 11g 中的限制子句

Oracle 11g DRCP配置与使用

oracle11g停止更新