使用 SQL 从 xml CLOB 中提取值

Using SQL to extract values from xml 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> 标签不包含 'name' 或 'key' 等标识符,而是列出另一个 <string> 条目高于实际值。 IE。 <string>ID</string> 是通常使用 <string name='ID'>81</string> 的参数,在这种情况下,“81”是我要提取的实际值。

参数可以在 xml 中以任何顺序列出,但是我知道我希望提取的参数的名称。所以我的问题是,有没有办法从 <string>Name</string> 条目中提取值(在本例中为 'John',但是这可以是任何值)

如果你愿意,你可以寻找 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