使用 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 架构的方法。从问题中,您似乎已经知道更好的方法是使用键名不是实际数据而是元素的 属性 的键值对(如果不是元素名称本身)。
此外,不要使用 EXTRACT
或 EXTRACTVALUE
,这些函数已被 Oracle 弃用。请改用 XMLTABLE
或 XMLQUERY
。
我目前正在尝试弄清楚如何使用 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 架构的方法。从问题中,您似乎已经知道更好的方法是使用键名不是实际数据而是元素的 属性 的键值对(如果不是元素名称本身)。
此外,不要使用 EXTRACT
或 EXTRACTVALUE
,这些函数已被 Oracle 弃用。请改用 XMLTABLE
或 XMLQUERY
。