[英]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.