2009-06-15 13 views
5

Quindi, ora che ho un grande bit di dati XML che mi interessa:Oracle: caricamento di un file xml di grandi dimensioni?

http://blog.stackoverflow.com/2009/06/stack-overflow-creative-commons-data-dump

mi piacerebbe caricare questo in Oracle con cui giocare.

Come caricare direttamente un file XML di grandi dimensioni direttamente in Oracle? Soluzioni lato server (dove è possibile aprire il file di dati sul server) e soluzioni client-side accolte con favore.

Ecco un po 'di badges.xml per un esempio concreto.

<?xml version="1.0" encoding="UTF-8" ?> 
    <badges> 
    <row UserId="3718" Name="Teacher" Date="2008-09-15T08:55:03.923"/> 
    <row UserId="994" Name="Teacher" Date="2008-09-15T08:55:03.957"/> 
    ... 

risposta

12

È possibile accedere ai file XML sul server tramite SQL. Con i vostri dati nel /tmp/tmp.xml, si dovrebbe prima di dichiarare la directory:

SQL> create directory d as '/tmp'; 

Directory created 

È quindi possibile interrogare il file XML direttamente:

SQL> SELECT XMLTYPE(bfilename('D', 'tmp.xml'), nls_charset_id('UTF8')) xml_data 
    2 FROM dual; 

XML_DATA 
-------------------------------------------------------------------------------- 
<?xml version="1.0" encoding="UTF-8"?> 
<badges> 
    [...] 

Per accedere ai campi nel file, è possibile utilizzare il metodo descritto another SO ad esempio:

SQL> SELECT UserId, Name, to_timestamp(dt, 'YYYY-MM-DD"T"HH24:MI:SS.FF3') dt 
    2 FROM (SELECT XMLTYPE(bfilename('D', 'tmp.xml'), 
          nls_charset_id('UTF8')) xml_data 
    3   FROM dual), 
    4   XMLTable('for $i in /badges/row 
    5        return $i' 
    6     passing xml_data 
    7     columns UserId NUMBER path '@UserId', 
    8       Name VARCHAR2(50) path '@Name', 
    9       dt VARCHAR2(25) path '@Date'); 

    USERID NAME  DT       
---------- ---------- --------------------------- 
     3718 Teacher 2008-09-15 08:55:03.923  
     994 Teacher 2008-09-15 08:55:03.957  
0

vorrei fare un semplice:

grep '<row' file.xml |\ 
gawk -F '"' '{printf("insert into badges(userid,name,date) values (\"%s\",\"%s\",\"%s\");\n",$2,$4,$6); } > request.sql 

oppure è possibile creare un programma Java utilizzando un parser SAX. Ogni volta che il tuo gestore trova una nuova "Riga" di elementi, ottieni gli attributi e inserisci un nuovo record nel tuo database.

3

Sembra che si stia parlando di 2 problemi - prima, ottenendo il documento XML in cui Oracle può vederlo. E poi forse facendo in modo che gli strumenti relazionali standard possano essere applicati ai dati.

Per il primo, tu o il tuo DBA potete creare una tabella con una colonna BLOB, CLOB o BFILE e caricare i dati. Se si ha accesso al server su cui risiede il database, è possibile definire un oggetto DIRECTORY nel database che punta a una directory del sistema operativo. Quindi metti il ​​tuo file lì. E quindi configurarlo come BFILE o leggerlo. (CLOB e BLOB memorizzano nel database; BFILE memorizza un file puntato su un sistema operativo).

In alternativa, utilizzare uno strumento che consenta di scrivere direttamente CLOB nel database. Ad ogni modo, questo ti porta al punto in cui puoi vedere il documento di istanza XML nel database.

Quindi ora il documento di istanza è visibile. Il passaggio 1 è fatto.

A seconda della versione, Oracle ha alcuni strumenti piuttosto buoni per distruggere l'XML in tabelle relazionali.

Può essere piuttosto dichiarativo. Mentre questo va al di là di ciò che ho effettivamente fatto (ho un progetto in cui lo proverò in autunno), puoi teoricamente caricare il tuo schema XML nel database e annotarlo con il crosswalk tra le tabelle relazionali e l'XML. Quindi prendi il tuo CLOB o BFILE e convertilo in una colonna XMLTYPE con lo schema definito e il gioco è fatto - la distruzione avviene automaticamente, i dati sono tutti lì, è tutto relazionale, è tutto disponibile per SQL standard senza XQUERY o XML estensioni.

Ovviamente, se preferisci usare XQUERY, prendi semplicemente CLOB o BFILE, convertilo in XMLTYPE e vai a prenderlo.

+0

In realtà c'era un buon blog di Marco Gralike su shredding nel database, http://www.liberidu.com/blog/?p=1094 –

Problemi correlati