[英]How to parse below xml in oracle sql
<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。
您可以使用XMLTable函数 :
XMLTable将XQuery评估的结果映射到关系行和列。 您可以使用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更有意义的别名! - 根据需要到其他表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.