2010-10-05 6 views
2

J'ai une table d'oracle qui a une colonne qui stocke XML dans un format CLOB. Le code XML a la syntaxe suivante:Comment extraire un noeud XML spécifique d'une table Oracle?

<?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> 

Maintenant, je souhaite récupérer uniquement les informations de papier correspondant à chaque élément. c'est-à-dire, donné un ID d'article, récupérer tous les papiers qui lui sont associés en utilisant une requête. Merci de me guider, quelle est la meilleure façon de le faire.

Répondre

5

Vous pouvez utiliser une combinaison de extract et 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 

Si vous cherchez un identifiant spécifique, vous pouvez filtrer les données directement dans la fonction 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

Je vous remercie beaucoup pour la réponse .. Cela a bien fonctionné avec SQL Plus .. – Pradeep

+0

Dans 11g [utilisation de la valeur d'extraction est obsolète] (http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/functions061.htm # i1131042). Pouvez-vous également donner un exemple en utilisant les fonctions recommandées, s'il vous plaît? – user272735

+0

@ user272735: voir [xml à oracle DB table] (http://stackoverflow.com/questions/1231981/xml-to-oracle-db-table-encountering-problems/1232209#1232209) ou [Oracle: chargement d'un grand fichier XML?] (http://stackoverflow.com/questions/998055/oracle-loading-a-large-xml-file/1000331#1000331) par exemple d'utilisation de XMLTABLE –

Questions connexes