[英]Parse XML to Oracle SQL
我有以下XML消息:
<?xml version="1.0" encoding="UTF-8"?>
<MSH>
<MSH.1>|</MSH.1>
<MSH.2>^~\&</MSH.2>
<MSH.3>
<HD.1>LAB</HD.1>
</MSH.3>
<MSH.4>
<HD.1>767543</HD.1>
</MSH.4>
<MSH.5>
<HD.1>ADT</HD.1>
</MSH.5>
<MSH.6>
<HD.1>767543</HD.1>
</MSH.6>
<MSH.7>199003141304-0500</MSH.7>
<MSH.9>
<CM_MSG.1>ACK</CM_MSG.1>
<CM_MSG.3>ACK_ACK</CM_MSG.3>
</MSH.9>
<MSH.10>XX3657</MSH.10>
<MSH.11>
<PT.1>P</PT.1>
</MSH.11>
<MSH.12>
<VID.1>2.4</VID.1>
</MSH.12>
</MSH>
我需要将其转换为下表:
Node Level 1 Node Level 2 Node Level 3 Value
MSH MSH.1 |
MSH MSH.2 ^~\&
MSH MSH.3 HD.1 LAB
我找到了一种使用ExtractValue在Oracle SQL中填充值的方法。 但是我不明白如何动态获取XML中的不同节点并进行赋值。
如何根据节点级别的数量动态解析XML并以上述表格格式存储?
完全动态解决方案不容易实现。主要问题是在结果集中生成动态列数。 为此,您必须使用复杂的技术:)示例: Dyn管道
但是,如果您可以假设xml中的级别限制,它会容易得多。
with xml_data as (select xmltype('<?xml version="1.0" encoding="UTF-8"?>
<MSH>
<MSH.1>|</MSH.1>
<MSH.2>lal</MSH.2>
<MSH.3>
<HD.1>LAB</HD.1>
</MSH.3>
<MSH.4>
<HD.1>767543</HD.1>
</MSH.4>
<MSH.5>
<HD.1>ADT</HD.1>
</MSH.5>
<MSH.6>
<HD.1>767543</HD.1>
</MSH.6>
<MSH.7>199003141304-0500</MSH.7>
<MSH.9>
<CM_MSG.1>ACK</CM_MSG.1>
<CM_MSG.3>ACK_ACK</CM_MSG.3>
</MSH.9>
<MSH.10>XX3657</MSH.10>
<MSH.11>
<PT.1>P</PT.1>
</MSH.11>
<MSH.12>
<VID.1>2.4</VID.1>
</MSH.12>
</MSH>') xd from dual)
select x.* from xml_data
,xmltable('//*[not(*)]' passing xd
columns
n_level_1 varchar2(4000) path '(ancestor-or-self::*/name(.))[1]'
,n_level_2 varchar2(4000) path '(ancestor-or-self::*/name(.))[2]'
,n_level_3 varchar2(4000) path '(ancestor-or-self::*/name(.))[3]'
,n_level_4 varchar2(4000) path '(ancestor-or-self::*/name(.))[4]'
,n_level_5 varchar2(4000) path '(ancestor-or-self::*/name(.))[5]'
,n_level_6 varchar2(4000) path '(ancestor-or-self::*/name(.))[6]'
,n_level_7 varchar2(4000) path '(ancestor-or-self::*/name(.))[7]'
,n_level_8 varchar2(4000) path '(ancestor-or-self::*/name(.))[8]'
,n_level_9 varchar2(4000) path '(ancestor-or-self::*/name(.))[9]'
,n_level_10 varchar2(4000) path '(ancestor-or-self::*/name(.))[10]'
--...n times
,n_value varchar2(4000) path './text()'
) x;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.