获取具有xml结构的Oracle CLOB的xml属性对

时间:2017-08-16 08:37:11

标签: xml oracle xmltable

我有一个具有以下结构的xml:

<xml>
    <ele1>
        <ele2>
            <Attribute Key="x1" Value="V1" />
            <Attribute Key="x2" Value="V2" />
            <Attribute Key="x3" Value="V3" />
            <Attribute Key="x4" Value="V4" />
            <Attribute Key="x5" Value="V5" />
        </ele2>
    </ele1>
</xml>

对于每个Key = x1和Key = x3,我想获得值。

目标表/ select应该包含以下列: ele2 | x1 | X2

实际我有以下代码:

SELECT Description.*, Other.*
FROM   (select XMLTYPE.createXML(XMLCODE) as XMLCODE from Table) myxml,
       XMLTABLE('/ele1/ele2/Attribute[@Key="x1"]'
         PASSING myxml.XMLCODE
         COLUMNS 
           "Description"    VARCHAR2(255)  PATH '@Value'
         ) Description,
        XMLTABLE('/ele1/ele2/Attribute[@Key="x2"]'
         PASSING myxml.XMLCODE
         COLUMNS 
           "Other"    VARCHAR2(255)  PATH '@Value'
         ) Other;

问题是XMLTables没有加入,我得到了一个笛卡尔积。任何想法还是有更简单的方法?

1 个答案:

答案 0 :(得分:0)

这里不需要多个XMLTable调用;你可以通过在columns子句中提供多个列来复制同一个节点中的多个值(这是一个复数 - 有点线索)。

select x.*
from myTable t
cross join XMLTable('/xml/ele1/ele2'
  passing xmltype(t.xmlcode)
  columns description varchar2(255) path 'Attribute[@Key="x1"]/@Value',
    other varchar2(255) path 'Attribute[@Key="x2"]/@Value'
) x;

两个属性值都来自同一个ele2节点。