【问题标题】:How to use XMLTable in Oracle on the following XML如何在 Oracle 中对以下 XML 使用 XMLTable
【发布时间】:2016-02-04 20:06:29
【问题描述】:

我在 Oracle 的一列中有 XML,存储为 CLOB 类型。我的目的是解析这个 XML 并检索与感兴趣的列相对应的数据。这是 XML 结构:

<ns:ABCDE xmlns:ns="http://www.something.com/something" xmlns:mno="http://www.somethingelse.com/05"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:type="ns:ABCDE"> 

<GGGGG> 
    <G1>G1_val</G1> 
    <G2>G2_val</G2> 
    <G3>G3_val</G3>
</GGGGG>
<PPPPP>
...
</PPPP>

</ns:ABCDE>

这是我的 SQL 代码:

    select x.*,p.*
    from ppp p ,xmltable(

    xmlnamespaces(default   'ABCDE',
    'http://www.something.com/something' as "ns",
    'http://www.somethingelse.com/05' as "mno", 
'http://www.w3.org/2001/XMLSchema-instance' as "xsi",
    'ns:ABCDE' as "type"
            ),    

    '/ns:ABCDE'
    PASSING xmltype(p.someCLOB_column)
    COLUMNS G1 varchar(32) PATH '/GGGGG'

    ) x  

但是,运行 SQL 后,它没有显示任何错误,但也没有获取任何记录。我希望得到“G1_val”作为此查询的结果。

代码哪里出错了?我对 xml/命名空间不太熟悉。

谢谢。

【问题讨论】:

  • 您的 XPath 有 ns:ABCCDE 而不是 ns:ABCDE 但这可能是造成问题的拼写错误。它在 xmlnamespaces 子句中也有一个尾随逗号。为什么您只期望G1_val 而不是GGGGG 下的所有三个节点?如果我使用您的示例运行该查询,我会得到 G1_valG2_valG3_val...
  • @AlexPoole - 谢谢。那些是错别字。我已经纠正了他们。正如你所说,是的,我应该得到 G1_valG2_valG3_val,我弄错了。但在我的情况下,我在运行查询时没有得到任何记录——甚至是不正确的数据。

标签: xml oracle oracle11g namespaces xmltable


【解决方案1】:

我不确定你为什么什么也没看到;我看到了错误的东西,但这可能取决于我认为的 Oracle 版本,或者您的真实 XML 和代码的差异。默认命名空间使问题令人困惑,不应该存在;并且 GGGGG 的路径不需要前导斜杠:

with ppp (someCLOB_column) as (
  select '<ns:ABCDE xmlns:ns="http://www.something.com/something" xmlns:mno="http://www.somethingelse.com/05"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns:ABCDE"> 
<GGGGG> 
    <G1>G1_val</G1> 
    <G2>G2_val</G2> 
    <G3>G3_val</G3>
</GGGGG>
<PPPPP>...</PPPPP>
</ns:ABCDE>' from dual
)
select x.g1
from ppp p
cross join xmltable(
  xmlnamespaces(--default 'ABCDE',
    'http://www.something.com/something' as "ns",
    'http://www.somethingelse.com/05' as "mno", 
    'http://www.w3.org/2001/XMLSchema-instance' as "xsi",
    'ns:ABCDE' as "type"
  ),    
  '/ns:ABCDE'
  PASSING xmltype(p.someCLOB_column)
  COLUMNS G1 varchar(32) PATH 'GGGGG'
) x 
/

G1                             
--------------------------------
G1_valG2_valG3_val              

您可能想要单独的值:

select x.g1, x.g2, x.g3, x.ppppp
from ppp p
cross join xmltable(
  xmlnamespaces(--default 'ABCDE',
    'http://www.something.com/something' as "ns",
    'http://www.somethingelse.com/05' as "mno", 
    'http://www.w3.org/2001/XMLSchema-instance' as "xsi",
    'ns:ABCDE' as "type"
  ),    
  '/ns:ABCDE'
  PASSING xmltype(p.someCLOB_column)
  COLUMNS G1 varchar(8) PATH 'GGGGG/G1',
    G2 varchar(8) PATH 'GGGGG/G2',
    G3 varchar(8) PATH 'GGGGG/G3',
    PPPPP varchar2(8) PATH 'PPPPP'
) x 
/

G1       G2       G3       PPPPP  
-------- -------- -------- --------
G1_val   G2_val   G3_val   ...     

【讨论】:

    猜你喜欢
    • 2014-08-14
    • 2016-04-28
    • 2017-12-06
    • 2012-09-23
    • 1970-01-01
    • 2020-04-29
    • 2022-01-13
    • 1970-01-01
    • 2014-04-08
    相关资源
    最近更新 更多