使用SQL从xml CLOB中提取值

时间:2016-03-31 09:55:17

标签: xml plsql clob

我目前正试图弄清楚如何使用plsql从存储在我的数据库中的xml CLOB值中提取一些值。

我的CLOB值如下所示:

<map>
  <entry>
    <string>HeaderOne</string>
    <string>
        <linked-hash-map>
            <entry>
                <string>ID</string>
                <string>81</string>
            </entry>
            <entry>
                <string>Name</string>
                <string>John</string>
            </entry>
            <entry>
                <string>SecondName</string>
                <string>Smith</string>
            </entry>
            <entry>
                <string>Age</string>
                <string>15</string>
            </entry>
        </linked-hash-map>
    </string>
  </entry>
  <entry>
    <string>HeaderTwo</string>
    <string>
        <linked-hash-map>
            <entry>
                <string>ID</string>
                <string>81</string>
            </entry>
            <entry>
                <string>ZIP</string>
                <string>99999</string>
            </entry>
            <entry>
                <string>Gender</string>
                <string>M</string>
            </entry>
        </linked-hash-map>
    </string>
  </entry>
</map>

我尝试使用EXTRAC(xmltype(myclob)方法,如下所述: Extract data from XML Clob using SQL from Oracle Database

但是,由于<string>代码并未包含“&#39; name&#39;或者&#39;键&#39;,而是列出高于实际值的另一个<string>条目。即<string>ID</string>是通常使用<string name='ID'>81</string>的参数,其中&#39; 81&#39}在这种情况下是我想要提取的实际值。

参数可以在xml中以任何顺序列出,但是我知道我想要提取的参数的名称。所以我的问题是,有没有办法提取例如<string>Name</string>条目中的值(在这种情况下&#39; John&#39;,但这可以是任何值)

1 个答案:

答案 0 :(得分:0)

如果你愿意,你可以寻找PIVOT输出的方法,但是这里是你如何阅读这样一个XML的开始 -

为简单起见,假设XML位于XMLTYPE类型的名为my_xml的变量中。

SELECT header_string, attribute_name, attribute_value
  FROM (WITH xm AS (SELECT my_xml AS x FROM DUAL)
        SELECT header_string, linked_hash_map
          FROM xm,
               XMLTABLE (
                  '//map/entry'
                  PASSING xm.x
                  COLUMNS header_string VARCHAR2 (100) PATH 'string[1]',
                          linked_hash_map XMLTYPE PATH 'string[2]/linked-hash-map'))
       l,
       XMLTABLE (
          '//linked-hash-map/entry'
          PASSING l.linked_hash_map
          COLUMNS attribute_name VARCHAR2 (100) PATH 'string[1]',
                  attribute_value VARCHAR2 (100) PATH 'string[2]');

我应该提一下,如果可能的话,寻找改进XML模式的方法。从这个问题来看,似乎你已经知道更好的方法是使用一个键值对,其中键名不是实际数据,而是元素的属性(如果不是元素名称本身)。

此外,请勿使用EXTRACTEXTRACTVALUE,Oracle已弃用这些功能。请改用XMLTABLEXMLQUERY