2009-06-15 24 views
5

Also jetzt, dass ich ein großes Stück von XML-Daten Ich habe Interesse an:Oracle: Laden einer großen XML-Datei?

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

ich dies in Oracle laden möchte, mit zu spielen.

Wie kann ich direkt eine große XML-Datei direkt in Oracle laden? Serverseitige Lösungen (wo die Datendatei auf dem Server geöffnet werden kann) und clientseitige Lösungen wurden begrüßt.

Hier ist ein bisschen badges.xml für ein konkretes Beispiel.

<?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"/> 
    ... 

Antwort

12

Sie können über SQL auf die XML-Dateien auf dem Server zugreifen. Mit Ihrer Daten im /tmp/tmp.xml, würden Sie zuerst das Verzeichnis deklarieren:

SQL> create directory d as '/tmp'; 

Directory created 

Sie dann Ihre XML-Datei direkt abfragen können:

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> 
    [...] 

Um die Felder in der Datei zugreifen, Sie könnte die Methode in another SO zum Beispiel beschrieben verwenden:

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

ich tun würde, ein einfaches:

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

oder Sie können ein Java-Programm mit einem SAX-Parser erstellen. Jedes Mal, wenn Ihr Handler eine neue Element-Zeile findet, erhalten Sie die Attribute und fügen einen neuen Datensatz in Ihre Datenbank ein.

3

Scheint, wie Sie etwa 2 Ausgaben sprechen - zunächst immer das XML-Dokument, wo Oracle sie sehen können. Und dann vielleicht so, dass standardmäßige relationale Werkzeuge auf die Daten angewendet werden können.

Zum einen können Sie oder Ihr DBA eine Tabelle mit einer BLOB-, CLOB- oder BFILE-Spalte erstellen und die Daten laden. Wenn Sie Zugriff auf den Server haben, auf dem die Datenbank lebt, können Sie in der Datenbank, die auf ein Betriebssystemverzeichnis verweist, ein DIRECTORY-Objekt definieren. Dann lege deine Datei dort hin. Und dann entweder als BFILE einrichten oder einlesen. (CLOB und BLOB speichern in der Datenbank; BFILE speichert einen Verweis auf eine Datei auf der Betriebssystemseite).

Verwenden Sie alternativ ein Tool, mit dem Sie CLOBs direkt in die Datenbank schreiben können. Wie auch immer, das bringt Sie zu dem Punkt, an dem Sie das XML-Instanzdokument in der Datenbank sehen können.

Jetzt haben Sie also das Instanzdokument sichtbar. Schritt 1 ist fertig.

Je nach Version verfügt Oracle über einige ziemlich gute Tools zum Zerkleinern von XML in relationale Tabellen.

Es kann ziemlich aussagekräftig sein. Während dies über das hinausgeht, was ich tatsächlich getan habe (ich habe ein Projekt, in dem ich es diesen Herbst ausprobieren werde), können Sie theoretisch Ihr XML-Schema in die Datenbank laden und es mit dem Zebrastreifen zwischen den relationalen Tabellen und dem XML kommentieren. Dann nehmen Sie Ihren CLOB oder BFILE und konvertieren Sie ihn in eine XMLTYPE-Spalte mit dem definierten Schema und Sie sind fertig - das Shredding passiert automatisch, die Daten sind alle da, es ist alles relational, es steht alles für Standard-SQL ohne XQUERY oder XML zur Verfügung Erweiterungen.

Natürlich, wenn Sie lieber XQUERY verwenden möchten, dann nehmen Sie einfach das CLOB oder BFILE, konvertieren Sie es in ein XMLTYPE und gehen Sie dafür.

+0

Es gab tatsächlich einen guten Blog-Eintrag von Marco Gralike heute auf Shreddern in der Datenbank, http://www.liberidu.com/blog/?p=1094 –

Verwandte Themen