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 Oracle Discussion :

[SQL LOADER] chargement d'un fichier XML dans un champ XMLTYPE


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [SQL LOADER] chargement d'un fichier XML dans un champ XMLTYPE
    Bonjour,

    Je doit charger un fichier XML dans un champ de XMLTYPE sous oracle 10
    Je suis donc aller sur le site d'oracle afin de consulter la documentation en ligne

    Malheureusement, il nous explique que le chargement de fichier XML dans un champ XMLTYPE ce fait de la meme facon que pour le chargement dans un champ CLOB
    Ensuite il nous donne des expliquations et des exemples avec un champ CLOB

    J'ai donc fait plusieur test mais rien de concluant

    Quelqu'un pourrai t'il m'aider ?

    Merci

  2. #2
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    post donc ton fichier de contrôle, pour qu'on puisse t'aider un peu mieux.
    Il faut typer avec XMLTYPE ta colonne.

    Je l'ai jamais fait il est vrai avec SQL*Loader, mais ceci fonctionne :

    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
    CREATE TABLE XML_NON_STRUCTURE
    (DOCNS_ID NUMBER PRIMARY KEY,
    DOCNS_DOCS XMLTYPE);
     
    CREATE INDEX IDX_XML_NON_STRUCTURE ON XML_NON_STRUCTURE (DOCNS_DOCS)
    INDEXTYPE IS CTXSYS.CONTEXT
    PARAMETERS ('DATASTORE CTXSYS.DIRECT_DATASTORE SECTION GROUP CTXSYS.PATH_SECTION_GROUP');
     
    INSERT INTO XML_NON_STRUCTURE values(
    1,
    XMLTYPE('<AuditeurDEF>
                     <AuditeurID>17861</AuditeurID>
                     <AuditeurNOM>MyName</AuditeurNOM>
                     <AuditeurPRENOM>MyPrenom</AuditeurPRENOM>
             </AuditeurDEF>'));

  3. #3
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    J'ai retrouvé au fin fond de mes sources un exemple de chargement

    Tu peux t'en inspirer, je pense

    The source of the data is the auditeurs.xml document.
    Extracting the data from the document involves several steps.
    First the XML document must be parsed and a DOMDocument created from it.
    Once the DOMDocument is created the parser is no longer needed so it's resources can be freed:

    v_parser := dbms_xmlparser.newParser;

    dbms_xmlparser.parseClob(v_parser, v_clob);
    v_doc := dbms_xmlparser.getDocument(v_parser);

    dbms_xmlparser.freeParser(v_parser);
    Next the XPATH syntax is used to get a DOMNodeList containing all the EMP nodes:

    v_nl := dbms_xslprocessor.selectNodes(dbms_xmldom.makeNode(v_doc),'/EMPLOYEES/EMP');
    Once we have the DOMNodeList we can loop through it getting the values for each node in turn. The values are returned using the XPATH sytax and placed in a table collection:

    v_n := dbms_xmldom.item(v_nl, cur_emp);
    dbms_xslprocessor.valueOf(v_n,'EMPNO/text()',t_tab(t_tab.last).empno);
    With all the data retrieved into the table collection the inserts can be performed. Putting it all together we get


    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    CREATE OR REPLACE PROCEDURE CHARGER_AUDITEURS
    IS
      v_bfile   BFILE;
      v_clob    CLOB;
      v_parser  DBMS_XMLPARSER.Parser;
      v_doc     DBMS_XMLDOM.DOMDocument;
      v_nl      DBMS_XMLDOM.DOMNodeList;
      v_n       DBMS_XMLDOM.DOMNode;
      v_temp    VARCHAR2(1000);
     
      TYPE tab_type IS TABLE OF auditeurs%ROWTYPE;
      t_tab  tab_type := tab_type();
    BEGIN
     
      v_bfile := BFileName('XML_DIR', 'auditeurs.xml');
      DBMS_LOB.createtemporary(v_clob, cache=>FALSE);
      DBMS_LOB.open(v_bfile, DBMS_LOB.lob_readonly);
      DBMS_LOB.loadFromFile(v_clob,v_bfile,DBMS_LOB.getLength(v_bfile));
      DBMS_LOB.close(v_bfile);
     
      DBMS_SESSION.SET_NLS('NLS_DATE_FORMAT','''DD-MON-YYYY''');
     
      -- Création d'un PARSER
      v_parser := DBMS_XMLPARSER.newParser;
     
      -- On parse le document et on crée un nouveau document DOM
      DBMS_XMLPARSER.parseClob(v_parser, v_clob);
      v_doc := DBMS_XMLPARSER.getDocument(v_parser);
     
      -- On libére les ressources associées à v_clob et v_parser, comme nous n'en avons plus besoin
      DBMS_LOB.freetemporary(v_clob);
      DBMS_XMLPARSER.freeParser(v_parser);
     
      -- liste des noeuds
      v_nl := DBMS_XSLPROCESSOR.selectNodes(DBMS_XMLDOM.makeNode(v_doc),'//AuditeurDEF');
     
      -- type record (1 item = 1 noeud de la liste v_nl) 
      FOR cur_auditeur IN 0..DBMS_XMLDOM.getLength(v_nl) - 1 LOOP
        v_n := DBMS_XMLDOM.item(v_nl, cur_auditeur);
     
        t_tab.extend;
     
        -- on utilise la syntaxe XPATH pour affecter les valeurs des éléments
        DBMS_XSLPROCESSOR.valueOf(v_n,'AuditeurID/text()',t_tab(t_tab.last).AuditeurID);
        DBMS_XSLPROCESSOR.valueOf(v_n,'AuditeurNOM/text()',t_tab(t_tab.last).AuditeurNOM);
        DBMS_XSLPROCESSOR.valueOf(v_n,'AuditeurPRENOM/text()',t_tab(t_tab.last).AuditeurPRENOM);
     
      END LOOP;
     
      FOR cur_auditeur IN t_tab.first .. t_tab.last LOOP
        INSERT INTO AUDITEURS
        VALUES
        (t_tab(cur_auditeur).AuditeurID,
         t_tab(cur_auditeur).AuditeurNOM,
         t_tab(cur_auditeur).AuditeurPRENOM);
      END LOOP;
     
      COMMIT; 
     
      --on libére les ressources associées au document
      DBMS_XMLDOM.freeDocument(v_doc);
     
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_LOB.freetemporary(v_clob);
        DBMS_XMLPARSER.freeParser(v_parser);
        DBMS_XMLDOM.freeDocument(v_doc);
     
    END CHARGER_AUDITEURS;

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/07/2012, 15h20
  2. Chargement de 2 fichier xml dans mon contexte
    Par Thomas_ats dans le forum Spring
    Réponses: 3
    Dernier message: 15/12/2008, 18h26
  3. Chargement d'un fichier XML dans un B_LOB
    Par Wise_Sherkaan dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 12/11/2008, 11h00
  4. Charger Fichiers XML dans une table avec SQL*LOADER
    Par devdev2003 dans le forum SQL
    Réponses: 2
    Dernier message: 14/01/2008, 10h40
  5. Réponses: 2
    Dernier message: 05/03/2007, 14h21

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