sql - 如何在oracle sql中解析下面的xml

标签 sql xml database oracle

<root>
<transactiondata>
<Info>
    <![CDATA[1234ABCD]]>
<Details>   
    <Data Name="Names">
        <FirstName>A</FirstName>
        <LastName>B</LastName>
        <DisplayName null="true"/>
    </Data>
    <Data Name="Names">
        <FirstName>C</FirstName>
        <LastName>D</LastName>
        <MiddleName>MName</MiddleName>
        <DisplayName>D C</DisplayName>
    </Data>
    <Data Name="Address">
        <Country>ABCDEF</Country>
    </Data>
</Details>
</Info>
<Info>
    <![CDATA[345JUHDE]]>
<Details>
    <Data Name="Names">
        <FirstName>AB</FirstName>
        <LastName>BC</LastName>
        <DisplayName>BC</DisplayName>
    </Data>
    <Data Name="Names">
        <FirstName>CD</FirstName>
        <LastName>DF</LastName>
        <MiddleName null="true"/>
    </Data>
    <Data Name="Phone">
        <PhoneNumber>7654333</PhoneNumber>
    </Data>
</Details>
</Info>
</transactiondata>

上面的xml作为clob存储在ClobData表中,我想将这个xml数据解析为临时表,以便将这个临时表与其他不同的表连接起来。

    CDATA   FirstName   LastName    DisplayName     MiddleName
1234ABCD    A           B           No Value        null
1234ABCD    C           D           D C             MName
345JUHDE    AB          BC          null            No Value

有人可以指导我如何将 clob 解析为上述格式吗? 我尝试了 TABLE(xmlsequence(extract(xmltype(clobdata.data_cache), '//Info/Data[@Name="Names"]'))) tempTable 但我无法访问 cdata。

最佳答案

您可以使用 the XMLTable function :

XMLTable maps the result of an XQuery evaluation into relational rows and columns. You can query the result returned by the function as a virtual relational table using SQL.

在这种情况下,因为每个详细信息部分下都有多个名称节点,所以您可以使用两个级别的 XMLTable;第一个获取 CDATA 文本和详细信息,第二个扩展详细信息以获取名称信息:

select x1.cdata, x2.firstname, x2.middlename, x2.lastname, x2.displayname
from clobdata c
cross join xmltable (
  '/root/transactiondata/Info'
  passing xmltype(c.data_cache)
  columns cdata varchar2(10) path './text()',
    details xmltype path 'Details'
) x1
cross join xmltable (
  'Details/Data[@Name="Names"]'
  passing x1.details
  columns firstname varchar2(10) path 'FirstName',
    middlename varchar2(10) path 'MiddleName',
    lastname varchar2(10) path 'LastName',
    displayname varchar2(10) path 'DisplayName'
) x2;

CDATA      FIRSTNAME  MIDDLENAME LASTNAME   DISPLAYNAM
---------- ---------- ---------- ---------- ----------
1234ABCD   A                     B                    
1234ABCD   C          MName      D          D C       
345JUHDE   AB                    BC         BC        
345JUHDE   CD                    DF                   

或直接转到名称,然后返回到 CDATA:

select x.cdata, x.firstname, x.middlename, x.lastname, x.displayname
from clobdata c
cross join xmltable (
  '/root/transactiondata/Info/Details/Data[@Name="Names"]'
  passing xmltype(c.data_cache)
  columns cdata varchar2(10) path './../../text()',
    firstname varchar2(10) path 'FirstName',
    middlename varchar2(10) path 'MiddleName',
    lastname varchar2(10) path 'LastName',
    displayname varchar2(10) path 'DisplayName'
) x;

CDATA      FIRSTNAME  MIDDLENAME LASTNAME   DISPLAYNAM
---------- ---------- ---------- ---------- ----------
1234ABCD   A                     B                    
1234ABCD   C          MName      D          D C       
345JUHDE   AB                    BC         BC        
345JUHDE   CD                    DF                   

更改 columns 参数的大小以匹配您希望看到的名称的实际长度。

然后您可以加入 x(或者如果您更喜欢 x1 和/或 x2)——尽管给 XMLTable 更有意义的别名! - 根据需要添加到其他表。

Read more about using XQuery .

关于sql - 如何在oracle sql中解析下面的xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42731707/

相关文章:

sql - select语句内的HQL比较

xml - 使用HXT解析Haskell中的多个子节点

mysql - 需要一个有效的查询来从两个表中进行选择

sql - Snowflake 在 COPY INTO 转换期间自动舍入数字

php自定义sql返回值

mysql - sql内连接删除

嵌套类型表的mysql组合计数

sql - MySQL 列值透视

java - 使用 DocumentBuilder 解析 XHTML 时出现无限循环 "parse"

css - 在 mxGraph 中添加一个滚动球