簡體   English   中英

將XML解析為Oracle SQL

[英]Parse XML to Oracle SQL

我有以下XML消息:

<?xml version="1.0" encoding="UTF-8"?>
<MSH>
   <MSH.1>|</MSH.1>
   <MSH.2>^~\&amp;</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                                    ^~\&amp;
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM