2009-06-15 8 views
5

Alors maintenant que j'ai un grand bit de données XML Je suis intéressé par:Oracle: chargement d'un gros fichier xml?

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

J'aimerais charger cela dans Oracle pour jouer avec.

Comment charger directement un gros fichier XML directement dans Oracle? Les solutions côté serveur (où le fichier de données peut être ouvert sur le serveur) et les solutions côté client sont les bienvenues.

Voici un peu de badges.xml pour un exemple concret.

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

Répondre

12

Vous pouvez accéder aux fichiers XML sur le serveur via SQL. Avec vos données dans le /tmp/tmp.xml, vous devez d'abord déclarer le répertoire:

SQL> create directory d as '/tmp'; 

Directory created 

Vous pouvez ensuite interroger votre fichier XML directement:

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

Pour accéder aux champs dans votre fichier, vous pouvez utiliser la méthode décrite dans another SO par exemple:

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

je ferais simple:

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

ou vous pouvez créer un programme Java en utilisant un analyseur SAX. Chaque fois que votre gestionnaire trouve un nouvel élément 'row', vous obtenez les attributs et insérez un nouvel enregistrement dans votre base de données.

3

on dirait que vous parlez de deux questions - Tout d'abord, obtenir le document XML où Oracle peut le voir. Et puis peut-être faire en sorte que les outils relationnels standards puissent être appliqués aux données. Pour la première fois, vous ou votre administrateur de base de données pouvez créer une table avec une colonne BLOB, CLOB ou BFILE et charger les données. Si vous avez accès au serveur sur lequel réside la base de données, vous pouvez définir un objet DIRECTORY dans la base de données qui pointe vers un répertoire du système d'exploitation. Ensuite, mettez votre fichier là. Et puis soit le configurer en tant que BFILE ou le lire. (CLOB et BLOB stocker dans la base de données, BFILE stocke un pointé vers un fichier sur le côté du système d'exploitation).

Vous pouvez également utiliser un outil qui vous permettra d'écrire directement des CLOB dans la base de données. Quoi qu'il en soit, cela vous amène au point où vous pouvez voir le document d'instance XML dans la base de données.

Vous avez maintenant le document d'instance visible. L'étape 1 est terminée. En fonction de la version, Oracle dispose de très bons outils pour déchiqueter le XML en tables relationnelles.

Cela peut être très déclaratif. Bien que cela dépasse ce que j'ai réellement fait (j'ai un projet où je vais l'essayer cet automne), vous pouvez théoriquement charger votre schéma XML dans la base de données et l'annoter avec le tableau croisé entre les tables relationnelles et le XML. Ensuite, prenez votre CLOB ou BFILE et convertissez-le en une colonne XMLTYPE avec le schéma défini et vous avez terminé - le déchiquetage se fait automatiquement, les données sont toutes là, tout est relationnel, tout est disponible pour le SQL standard sans XQUERY ou XML extensions.

Bien sûr, si vous préférez utiliser XQUERY, alors prenez simplement le CLOB ou BFILE, convertissez-le en XMLTYPE, et allez-y.

+0

Il y avait en fait un bon billet de Marco Gralike aujourd'hui sur le déchiquetage dans la base de données, http://www.liberidu.com/blog/?p=1094 –

Questions connexes