如何从Oracle表中检索特定的XML节点?
问题描述:
我有一个oracle表,它有一个以CLOB格式存储XML的列。 XML具有以下语法:如何从Oracle表中检索特定的XML节点?
<?xml version="1.0" encoding="ISO-8859-1" ?>
<BaseXML Version="2009.4">
<InvoiceCanvasDetails>
<Grouping>
<ParentGroup Name=”Parent group 1” ID=”100”>
<ParentGroupLineItems>
<Item ID="461616" Name=”Item 1”>
<Papers Quantity=10000>
<Paper Name="UNCOATED GROUNDWOOD SCA+ (25X38)"
ID="126287" Weight="1268" Type=”A4” />
<Paper Name="COATED GROUNDWOOD SCA+ (25X38)"
ID="126288" Weight="1290" Type=”A4” />
</Papers>
</Item>
</ParentGroupLineItems>
</ParentGroup>
</Grouping>
</InvoiceCanvasDetails>
</BaseXML>
现在,我只想检索与每个项目对应的纸张信息。即给定项目ID,使用查询检索与其关联的所有论文。请指导我这是做到这一点的最佳方式。
答
您可以使用extract
和extractvalue
组合:
SQL> SELECT extractvalue(column_value, 'Paper/@Name') NAME,
2 extractvalue(column_value, 'Paper/@ID') ID,
3 extractvalue(column_value, 'Paper/@Weight') Weight,
4 extractvalue(column_value, 'Paper/@Type') TYPE
5 FROM TABLE (SELECT xmlsequence(XMLTYPE(a).extract('BaseXML/' ||
6 'InvoiceCanvasDetails/' ||
7 'Grouping/ParentGroup/' ||
8 'ParentGroupLineItems/' ||
9 'Item/Papers/Paper'))
10 FROM t);
NAME ID WEIGHT TYPE
---------------------------------------- ---------- ---------- -----
UNCOATED GROUNDWOOD SCA+ (25X38) 126287 1268 A4
COATED GROUNDWOOD SCA+ (25X38) 126288 1290 A4
如果你正在寻找一个特定的ID,就可以直接在extract
功能筛选数据:
SQL> SELECT extract(XMLTYPE(a),
2 'BaseXML/InvoiceCanvasDetails/Grouping/' ||
3 'ParentGroup/ParentGroupLineItems/' ||
4 'Item/Papers/Paper[@ID="126287"]') ext
5 FROM t;
EXT
--------------------------------------------------------------------------------
<Paper Name="UNCOATED GROUNDWOOD SCA+ (25X38)" ID="126287" Weight="1268" Type="A
4"/>
非常感谢你很多的答案..这与SQL加号工作得很好.. – Pradeep 2010-10-06 06:34:38
在11g [使用extractvalue已弃用](http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/functions061.htm #i1131042)。你能举一个使用推荐功能的例子吗? – user272735 2011-05-27 06:36:38
@ user272735:参见[xml to oracle数据库表](http://stackoverflow.com/questions/1231981/xml-to-oracle-db-table-encountering-problems/1232209#1232209)或[Oracle:加载大xml文件?](http://stackoverflow.com/questions/998055/oracle-loading-a-large-xml-file/1000331#1000331)例如使用XMLTABLE – 2011-05-27 08:40:18