我目前正试图弄清楚如何使用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;,但这可以是任何值)
答案 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模式的方法。从这个问题来看,似乎你已经知道更好的方法是使用一个键值对,其中键名不是实际数据,而是元素的属性(如果不是元素名称本身)。
此外,请勿使用EXTRACT
或EXTRACTVALUE
,Oracle已弃用这些功能。请改用XMLTABLE
或XMLQUERY
。