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

XQUERY/SGBD XML Discussion :

[Oracle] [XSLT] Chargement de XML dans une table oracle [SGBDR]


Sujet :

XQUERY/SGBD XML

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 50
    Points : 50
    Points
    50
    Par défaut [Oracle] [XSLT] Chargement de XML dans une table oracle
    Bonjour,

    Ce problème doit être déjà résolu sur le forum mais je n'arrive pas à tomber dessus.

    Je reçois un fichier XML pour lequel je dois insérer les données dans une table oracle. Je ne veux pas insérer le fichier entier dans une variable CLOB de ma table.

    Nous disposons de 2 procédures.
    1) Une qui prend le fichier et le transforme en CLOB par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBMS_LOB.LOADFROMFILE(VLOBD, V_FICHIER, DBMS_LOB.LOBMAXSIZE);
    2) Une qui fait l'insertion dans la table en appliquant une transformation en XSL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DBMS_XMLSTORE.INSERTXML(V_INSCTX,XMLTYPE.TRANSFORM(V_XML_IN , V_XSL_IN))
    D'après ce que j'aurais compris par mes lectures, un formatage est appliqué en bonne et due forme du XML en XSL avant d'insérer les données dans la table dont le nom est contenu dans V_INSCTX.

    Moi je reçois juste le fichier XML. Je connais les champs que je dois insérer dans ma table. Je suppose qu'il faut maintenant que j'écrive un XSL en y spécifiant mes noms de colonnes. Etant débutant, mes procédures se plantent car mon XSL n'est pas bon.

    Quelqu'un pourrait-il me donner un exemple XSL d'une table TOTO comportant 3 champs Identifiant, Nom et Prénom ?

    Je me perds avec les for each

    J'ai qque chose de ce genre :
    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
    <?xml version="1.0"?>
    <xsl:stylesheet
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     version="1.0">
     <xsl:template match="/">
        <ROWSET>
               <xsl:for-each select="TOTO"> 
           <ROW> 
                <ID_DOSSIER>
                    <xsl:value-of select="id_dossier" />
                </ID_DOSSIER>
                <NOM>
                    <xsl:value-of select="NOM" />
                </NOM>
                <PRENOM>
                    <xsl:value-of select="PRENOM" />
                </PRENOM>
          </ROW>
             </xsl:for-each>
       </ROWSET>      
     </xsl:template>       
    </xsl:stylesheet>
    Merci,

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Il nous faut la structure de ton xml de départ pour t'aider

    Je présume qu'il n'est pas au format canonique ?


    PS: Je serais intéressé par la suite des événements.

    J'ai un peu la même problématique et on avait pensé à la même chose mais en passant par les package dbms_xslprocessor et dbms_xmlsave mais on regarde maintenant du coté de SQL Loader qui semble pouvoir être paramétré pour du XML

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 50
    Points : 50
    Points
    50
    Par défaut
    Bonjour Erwy,

    Merci d'avoir répondu.

    Comme je suis en test, je n'ai pas encore reçu le vrai fichier XML, mais j'en ai simulé un par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare
      fxml clob;
    begin
        fxml := dbms_xmlgen.getxml ('Select * from TOTO');
        dbms_output.Put_line (fxml);
    end;
    Voici ce que j'ai obtenu et que j'ai mis dans le répertoire approprié :

    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
    <?xml version="1.0"?>
    <ROWSET>
     <ROW>
      <ID_DOSSIER>1</ID_DOSSIER>
      <NOM>Chartran</NOM>
      <PRENOM>Norbert</PRENOM>
     </ROW>
     <ROW>
      <ID_DOSSIER>2</ID_DOSSIER>
      <NOM>Puce</NOM>
      <PRENOM>Placide</PRENOM>
     </ROW>
     <ROW>
      <ID_DOSSIER>3</ID_DOSSIER>
      <NOM>Caillou</NOM>
      <PRENOM>Pilou</PRENOM>
     </ROW>
    </ROWSET>
    Voici la procédure d'insertion que nous avons :

    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 OR REPLACE PROCEDURE GIP_PC_INS_XML(V_NOM_TABLE IN VARCHAR2,V_XML_IN  XMLTYPE,V_XSL_IN  XMLTYPE) IS
       V_INSCTX    DBMS_XMLSTORE.CTXTYPE;
       V_NB_LIGNES NUMBER(10);
    BEGIN
       V_INSCTX := DBMS_XMLSTORE.NEWCONTEXT(V_NOM_TABLE);
       V_NB_LIGNES := DBMS_XMLSTORE.INSERTXML(V_INSCTX,XMLTYPE.TRANSFORM(V_XML_IN, V_XSL_IN));
       DBMS_XMLSTORE.CLOSECONTEXT(V_INSCTX);
     
       EXCEPTION
        WHEN OTHERS THEN
         INSERT INTO UTL_GIP112_TMP2 (ID_ERREUR,DESC_MSG)
         VALUES('MSG-808E',UTL_FC_ERRMSG('MSG-808E'));
         DBMS_OUTPUT.PUT_LINE('MSG-808E'||';'||UTL_FC_ERRMSG('MSG-808E'));
    END;
    /
    Voici la procédure de chargement que nous avons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR REPLACE PROCEDURE GIP_PC_CHARGER_FICHIER_LOB(VLOBD OUT CLOB,	 VFILE VARCHAR2, VDIR VARCHAR2) IS
      V_FICHIER BFILE := BFILENAME(VDIR,VFILE);
    BEGIN
      VLOBD := ' ';
      DBMS_LOB.OPEN(VLOBD,DBMS_LOB.LOB_READWRITE);
      DBMS_LOB.FILEOPEN(V_FICHIER, DBMS_LOB.FILE_READONLY);
      DBMS_LOB.LOADFROMFILE(VLOBD, V_FICHIER, DBMS_LOB.LOBMAXSIZE);
     
      DBMS_LOB.CLOSE(V_FICHIER);
      DBMS_LOB.CLOSE(VLOBD);
     
    END;
    /
    Ma procédure celle que j'ai écrite et qui utilise les 2 premières pour faire mon insertion est la suivante :

    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
    CREATE OR REPLACE PROCEDURE Ins_TOTO IS
     
        V_XML_DOC           CLOB;
        V_FICH_XML          VARCHAR2(50);
        V_XSL_DOC           CLOB;
        V_FICH_XSL          VARCHAR2(50);
        V_XML                 XMLTYPE;
        V_XSL                  XMLTYPE;
        V_REPERTOIRE_XML    VARCHAR2(50);
        V_REPERTOIRE_XSL    VARCHAR2(50);
     
    BEGIN
     
       V_REPERTOIRE_XML := 'FICHIER_XML'; 
       V_FICH_XML           := 'Essai_Xml.xml';
     
       GIP_PC_CHARGER_FICHIER_LOB (V_XML_DOC, V_FICH_XML,
    V_REPERTOIRE_XML);
     
       V_REPERTOIRE_XSL := 'GIP_FICHIER_XSL';
       V_FICH_XSL           := 'Essai_Xsl.xsl';
     
       GIP_PC_CHARGER_FICHIER_LOB (V_XSL_DOC, V_FICH_XSL, V_REPERTOIRE_XSL);
     
       V_XML            := XMLTYPE (V_XML_DOC);
       V_XSL            := XMLTYPE (V_XSL_DOC);
     
       GIP_PC_INS_XML ('TOTO', V_XML ,V_XSL);
     
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
           NULL;
         WHEN OTHERS THEN
           -- Consider logging the error and then re-raise
           RAISE;
    END Ins_Registre;
    /
    Merci,

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

Discussions similaires

  1. chargement de Table SAS dans une table Oracle
    Par id301077 dans le forum Administration et Installation
    Réponses: 2
    Dernier message: 05/03/2009, 17h56
  2. import fichier XML dans une table oracle 10g
    Par aijedelachance dans le forum Import/Export
    Réponses: 0
    Dernier message: 08/02/2009, 21h52
  3. Réponses: 2
    Dernier message: 08/01/2009, 14h20
  4. Réponses: 3
    Dernier message: 28/11/2006, 08h44
  5. [Oracle] Importer du xml dans une table
    Par lenoil dans le forum Oracle
    Réponses: 2
    Dernier message: 05/06/2006, 13h06

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