<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 更有意义的别名! - 根据需要添加到其他表。
关于sql - 如何在oracle sql中解析下面的xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42731707/