oracle plsql: comment analyser XML et insérer dans une table

comment charger un fichier xml imbriqué dans une table de base de données ?

<?xml version="1.0" ?> 
<person>
   <row>
       <name>Tom</name>
       <Address>
           <State>California</State>
           <City>Los angeles</City>
       </Address>
   </row>
   <row>
       <name>Jim</name>
       <Address>
           <State>California</State>
           <City>Los angeles</City>
       </Address>
   </row>
</person>       

dans ce xml, la personne est le nom de la table , le nom est le nom déposé, Tom est sa valeur déposée. L'adresse est une adresse subtable et l'état et la ville sont deux colonnes à L'intérieur de L'adresse. Je veux insérer la personne en ligne dans la table personne, si elle a échoué , ne pas insérer dans la table d'adresses. Ce xml pourrait être très grand. Quelle est la meilleure solution pour cela ?

20
demandé sur Frank 2012-10-20 01:26:42

4 réponses

Vous pouvez charger un document XML dans un XMLType, puis l'interroger, par exemple:

DECLARE
  x XMLType := XMLType(
    '<?xml version="1.0" ?> 
<person>
   <row>
       <name>Tom</name>
       <Address>
           <State>California</State>
           <City>Los angeles</City>
       </Address>
   </row>
   <row>
       <name>Jim</name>
       <Address>
           <State>California</State>
           <City>Los angeles</City>
       </Address>
   </row>
</person>');
BEGIN
  FOR r IN (
    SELECT ExtractValue(Value(p),'/row/name/text()') as name
          ,ExtractValue(Value(p),'/row/Address/State/text()') as state
          ,ExtractValue(Value(p),'/row/Address/City/text()') as city
    FROM   TABLE(XMLSequence(Extract(x,'/person/row'))) p
    ) LOOP
    -- do whatever you want with r.name, r.state, r.city
  END LOOP;
END;
26
répondu Jeffrey Kemp 2012-10-22 03:24:46
select *  
FROM XMLTABLE('/person/row'  
         PASSING   
            xmltype('
                <person>
                   <row>
                       <name>Tom</name>
                       <Address>
                           <State>California</State>
                           <City>Los angeles</City>
                       </Address>
                   </row>
                   <row>
                       <name>Jim</name>
                       <Address>
                           <State>California</State>
                           <City>Los angeles</City>
                       </Address>
                   </row>
                </person>
            ')
         COLUMNS  
            --describe columns and path to them:  
            name  varchar2(20)    PATH './name',  
            state varchar2(20)    PATH './Address/State',  
            city  varchar2(20)    PATH './Address/City'
     ) xmlt  
;  
10
répondu daggett 2014-05-23 13:53:04
CREATE OR REPLACE PROCEDURE ADDEMP
    (xml IN CLOB)
AS
BEGIN
    INSERT INTO EMPLOYEE (EMPID,EMPNAME,EMPDETAIL,CREATEDBY,CREATED)
    SELECT 
        ExtractValue(column_value,'/ROOT/EMPID') AS EMPID
       ,ExtractValue(column_value,'/ROOT/EMPNAME') AS EMPNAME
       ,ExtractValue(column_value,'/ROOT/EMPDETAIL') AS EMPDETAIL
       ,ExtractValue(column_value,'/ROOT/CREATEDBY') AS CREATEDBY
       ,ExtractValue(column_value,'/ROOT/CREATEDDATE') AS CREATEDDATE
    FROM   TABLE(XMLSequence( XMLType(xml))) XMLDUMMAY;

    COMMIT;
END;
6
répondu Hemant Kumar Bankey 2013-08-07 13:04:43

vous aurez besoin d'écrire beaucoup de code pour traiter des fichiers XML Complexes avec Oracle. Si vous avez des volumes importants de XML alors la performance peut être une préoccupation aussi. Les analyseurs XML de niveau d'entreprise vous permettront de traiter de grands volumes de fichiers XML complexes dans un format relationnel sans écrire de code. Ce blog montre comment charge en vrac des fichiers XML complexes à Oracle sans écrire de code

3
répondu Uli Bethke 2017-03-07 12:18:29