如何从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,使用查询检索与其关联的所有论文。请指导我这是做到这一点的最佳方式。

您可以使用extractextractvalue组合:

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"/> 
+0

非常感谢你很多的答案..这与SQL加号工作得很好.. – Pradeep 2010-10-06 06:34:38

+0

在11g [使用extractvalue已弃用](http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/functions061.htm #i1131042)。你能举一个使用推荐功能的例子吗? – user272735 2011-05-27 06:36:38

+0

@ 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

看看在Oracle中使用XPATH expressions