2012-10-19 27 views
17

Come caricare un file xml nidificato nella tabella del database?oracle plsql: come analizzare XML e inserire nella tabella

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

In questo xml, persona è il nome della tabella, il nome è il nome depositato, Tom è il suo valore archiviato. L'indirizzo è una sottotabella e lo stato e la città sono due colonne all'interno dell'indirizzo. Voglio inserire la riga persona nella tabella delle persone, se non è riuscita, non inserire nella tabella degli indirizzi. Questo xml potrebbe essere molto grande. Qual è la migliore soluzione per farlo?

+0

Prova questa https://forums.oracle.com/forums/thread.jspa?messageID=10269899 – user75ponic

+0

ho ottenuto piccolo albero XML differente, pls aiuto :) http://stackoverflow.com/questions/18583872/oracle-xml-skip-not-exist-node – zrosystem

risposta

23

È possibile caricare un documento XML in un XMLType, quindi eseguire una query di esso, ad es .:

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; 
+0

Questo può aiutare, ma un grosso problema è che non posso conoscere il nome del tag, l'input è dinamico xml con tutti nomi di tabelle e campi diversi – Frank

+3

Bene, è necessario sapere quali sono i tag, altrimenti come si suppone che il codice sappia dove inserire i dati? –

+0

Ho risolto questo problema utilizzando l'API dbms_xmldom. Grazie per il vostro aiuto – Frank

6
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; 
8
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 
; 
+0

Quando ho più tag di indirizzo all'interno dello , si sta verificando un errore. Cosa devo modificare per scorrere più tag con lo stesso nome? Per favore aiuto – Murali

+0

Se vuoi accedere al primo, xpath sarà come: './Address[1]/City' – daggett

2

Avrete bisogno di scrivere un sacco di codice per elaborare file XML complessi con Oracle. Se si dispone di grandi volumi di XML, anche le prestazioni potrebbero essere una preoccupazione. I parser XML di livello enterprise consentono di elaborare grandi volumi di file XML complessi in un formato relazionale senza scrivere codice. Questo post del blog mostra come bulk load complex XML files to Oracle senza scrivere codice

Problemi correlati