【问题标题】:Using SQL to extract values from xml CLOB使用 SQL 从 xml CLOB 中提取值
【发布时间】:2016-07-19 16:57:08
【问题描述】:

我目前正在尝试弄清楚如何使用 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

但这在我的情况下不起作用,因为&lt;string&gt; 标签不包含诸如“名称”或“键”之类的标识符,而是在实际值上方列出另一个&lt;string&gt; 条目。 IE。 &lt;string&gt;ID&lt;/string&gt; 是通常使用 &lt;string name='ID'&gt;81&lt;/string&gt; 的参数,在这种情况下,'81' 是我想要提取的实际值。

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

【问题讨论】:

  • 所以&lt;entry&gt; 中&lt;string&gt; 元素的顺序将决定它是属性名称还是属性值?
  • 是的,你猜对了

标签: xml plsql clob


【解决方案1】:

如果你愿意,你可以寻找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 模式的方法。从问题中,您似乎已经知道更好的方法是使用键值对,其中键名称不是实际数据而是元素的属性(如果不是元素名称本身)。

另外,不要使用EXTRACT 或EXTRACTVALUE,这些功能已被Oracle 弃用。请改用XMLTABLE 或XMLQUERY。

【讨论】:

  • 感谢您的回答,我稍后会检查并报告结果!
猜你喜欢
  • 1970-01-01
  • 2019-07-29
  • 2014-01-04
  • 2023-03-09
  • 1970-01-01
  • 2012-11-26
  • 2015-09-08
  • 2012-11-16
  • 2015-07-24
相关资源
最近更新 更多