IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL*Loader Oracle Discussion :

Chargement XML via un fichier CTL


Sujet :

SQL*Loader Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    décembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : décembre 2013
    Messages : 7
    Points : 9
    Points
    9
    Par défaut Chargement XML via un fichier CTL
    Bonjour tout le monde,

    Mon but est de charger les données d'un fichier XML dans une table d'une base de données Oracle en passant par une requête SQL*Loader et un fichier de description CTL.

    1 - Requête SQL*Loader utilisée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sqlldr\
    userid= user\
    control=path_to_ctl\
    data=path_to_xml\
    log=path_to_log\
    bad=path_to_bad\
    discard=path_to_dsc\
    silent='header,feedback'
    2 - Format du fichier XML en entrée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?xml version="1.0" encoding="utf-8"?>
    <!-- Created with Liquid XML 2013 Designer Edition (Trial) 11.1.0.4725 (http://www.liquid-technologies.com) -->
    <socle:FLUX xmlns:obj="http://Objets_Metiers" xmlns:socle="http://Socle_Librairie" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <EnTete>
            .......
        </EnTete>
        <Donnees>
            <obj:DOMAINE>
                <C1>VAL1_C1</C1>
    	    <C2>
                      <C21>VAL1_C2</C21>
                </C2>
    	    <C3>VAL1_C3</C3>
            </obj:DOMAINE>
        </Donnees>
    </socle:FLUX>
    3- Format du fichier CTL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    LOAD DATA   
    INFILE "fic" "str '</obj:DOMAINE>'"   
    append INTO TABLE MA_TABLE
    TRAILING NULLCOLS
    (
    	dummy filler terminated by ">",
    	C1	ENCLOSED BY "<C1>" AND "</C1>",
    	C2	ENCLOSED BY "<C2><C21>" AND "</C21></C2>",
    	C3	ENCLOSED BY "<C3>" AND "</C3>"
    )
    4- Erreur obtenue à l'éxcution du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Record 1: Rejected - Error on table MA_TABLE, column C1.
    Initial enclosure character not found
    Record 2: Rejected - Error on table MA_TABLE, column C1.
    Initial enclosure character not found
     
    Table MA_TABLE:
      0 Rows successfully loaded.
      2 Rows not loaded due to data errors.
      0 Rows not loaded because all WHEN clauses were failed.
      0 Rows not loaded because all fields were null.
     
     
    Space allocated for bind array:                  49536 bytes(64 rows)
    Read   buffer bytes: 1048576
     
    Total logical records skipped:          0
    Total logical records read:             2
    Total logical records rejected:         2
    Total logical records discarded:        0
    D'après les logs, on remarque que le programme a lu 2 records, alors qu'il n'existe qu'un seul enregistrement dans le fichier XML.
    Il est fort probable que le fichier CTL ne décrit pas bien le fichier XML en entrée, et c'est pour ça que je me tourne vers vous.

    Merci également de bien noter si la description de la balise <C2><C21> est bien faite dans le fichier CTL.

    Je vous remercie d'avance pour vos suggestions.

    Cordialement.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    décembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations forums :
    Inscription : décembre 2013
    Messages : 7
    Points : 9
    Points
    9
    Par défaut
    Solution trouvée.
    Il faut modifier le fichier CTL comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    LOAD DATA   
    INFILE "fic" "str '</obj:DOMAINE>'"   
    append INTO TABLE MA_TABLE
    TRAILING NULLCOLS
    (
    	dummy1 filler char(2000) terminated BY "<obj:DOMAINE>",
    	C1	ENCLOSED BY "<C1>" AND "</C1>",
    	C2	ENCLOSED BY "<C2>\n\t\t\t\t<C21>" AND "</C21>\n\t\t\t</C2>",
    	C3	ENCLOSED BY "<C3>" AND "</C3>",
            dummy1 filler char(2000) terminated BY "</obj:DOMAINE>",
    )

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Laissez tomber les bricolages via "Enclosed By" depuis SqlLoader et utilisez plutôt XQuery
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as mni
     
    SQL> 
    SQL> With Data As (
      2    Select xmltype(
      3        bfilename('TEMP', 't_x.xml'),
      4        nls_charset_id('AL32UTF8')
      5      ) x_el
      6      from dual
      7  )
      8  Select a.*
      9    from Data t,
     10         XMLTable(XMLNAMESPACES('http://Objets_Metiers' As "obj",
     11                                'http://Socle_Librairie' As "socle"
     12                               ),
     13                  'for $i in /socle:FLUX/Donnees/obj:DOMAINE
     14                   return $i
     15                  '
     16                  passing t.x_el
     17                  COLUMNS LigNo For ORDINAlITY,
     18                          C1         Varchar2(10)  PATH 'C1',
     19                          C21        Varchar2(10)  PATH 'C2/C21',
     20                          C3         Varchar2(10)  PATH 'C3'
     21                 ) a
     22  /
     
         LIGNO C1         C21        C3
    ---------- ---------- ---------- ----------
             1 VAL1_C1    VAL1_C2    VAL1_C3
     
    SQL>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. chargement fichier xml via sqlldr
    Par bigjos99 dans le forum Oracle
    Réponses: 0
    Dernier message: 25/03/2008, 17h09
  2. [XML] [PHP-Flash] écrire dans un fichier XML via un fichier PHP
    Par morgiane dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 24/11/2006, 12h05
  3. [VB NET]: Modifier un fichier XML via un DataSet
    Par ADONET dans le forum Windows Forms
    Réponses: 1
    Dernier message: 08/02/2006, 18h54
  4. [XML] Lire un fichier uniquement via mon application ?
    Par charliejo dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 20/01/2006, 16h26
  5. Accès à un fichier xml via hibernate
    Par boisdin dans le forum Hibernate
    Réponses: 12
    Dernier message: 20/01/2005, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo