2009-06-15 20 views
5

Więc teraz, że mam dużą bit danych XML Jestem zainteresowany:Oracle: ładowanie dużego pliku xml?

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

Chciałbym załadować to do Oracle do zabawy.

Jak mogę bezpośrednio załadować duży plik XML bezpośrednio do Oracle? Rozwiązania po stronie serwera (w których plik danych można otworzyć na serwerze) i rozwiązania po stronie klienta są mile widziane.

Oto fragment odznaki.xml dla konkretnego przykładu.

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

Odpowiedz

12

Możesz uzyskać dostęp do plików XML na serwerze za pośrednictwem SQL. Ze swoimi danymi w /tmp/tmp.xml, byś najpierw zadeklarować katalogu:

SQL> create directory d as '/tmp'; 

Directory created 

Można wtedy zapytanie do pliku XML bezpośrednio:

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

Aby uzyskać dostęp do pól w pliku, można użyć metody opisanej w another SO na przykład:

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

chciałbym zrobić prosty:

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

lub można utworzyć program Java, przy użyciu parsera SAX. Za każdym razem, gdy twój przewodnik znajdzie nowy wiersz "Element", otrzymasz atrybuty i wstawisz nowy rekord do swojej bazy danych.

3

Wygląda jak mówisz 2 problemy - po pierwsze, uzyskanie dokumentu XML do Oracle, gdzie można go zobaczyć. A może być tak, aby można było zastosować do danych standardowe narzędzia relacyjne.

Po raz pierwszy Ty lub Twój DBA możecie stworzyć tabelę z kolumną BLOB, CLOB lub BFILE i załadować dane. Jeśli masz dostęp do serwera, na którym znajduje się baza danych, możesz zdefiniować obiekt DIRECTORY w bazie danych, który wskazuje katalog systemu operacyjnego. Następnie umieść tam swój plik. A następnie skonfiguruj go jako BFILE lub odczytaj. (Magazyn CLOB i BLOB w bazie danych, BFILE przechowuje wskazany plik po stronie systemu operacyjnego).

Można również użyć narzędzia, które umożliwia bezpośrednie zapisywanie obiektów CLOB do bazy danych. W każdym razie doprowadza cię to do punktu, w którym możesz zobaczyć dokument XML w bazie danych.

Teraz masz już dokument wystąpienia. Krok 1 jest zakończony.

W zależności od wersji, Oracle oferuje całkiem dobre narzędzia do niszczenia XML-a w relacyjnych tabelach.

Może być dość deklaratywny. Chociaż wykracza to poza to, co faktycznie zrobiłem (mam projekt, w którym będę próbować tej jesieni), teoretycznie możesz załadować swój schemat XML do bazy danych i opisać go za pomocą przejścia między tabelami relacyjnymi a XML. Następnie weź CLOB lub BFILE i przekształć go w kolumnę XMLTYPE ze zdefiniowanym schematem i gotowe - niszczenie dzieje się automatycznie, wszystkie dane są dostępne, wszystko jest relacyjne, wszystko jest dostępne dla standardowego SQL bez XQUERY lub XML rozszerzenia.

Oczywiście, jeśli wolisz używać XQUERY, po prostu weź CLOB lub BFILE, przekonwertuj go na XMLTYPE i przejdź do niego.

+0

W dniu dzisiejszym Marco Gralike opublikował dobry wpis na blogu na temat niszczenia bazy danych: http://www.liberidu.com/blog/?p=1094 –

Powiązane problemy