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

PL/SQL Oracle Discussion :

Lecture XML via XMLTable : lire le fichier en 1 seule fois [11g]


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut Lecture XML via XMLTable : lire le fichier en 1 seule fois
    Bonjour A tous
    je vais essayer d’être clair
    j'ai le fichier XML suivant et j'essaye de traiter des infos qui ne sont pas sur le meme niveau hierarchique (ici le tag requestId avec les tags networkAccounId)
    cat /tmp/Response.xml
    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
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <batchNewResponse>
        <entry>
            <requestId>EN014383</requestId>
            <select>FixePhoneNumber,MobilePhoneNumber,EmailAdresse</select>
            <count>9</count>
            <nblines>7</nblines>
        </entry>
        <feed>
        <networkAccountId id="001234567">"+33025117528","",""</networkAccountId>
            <networkAccountId id="000123456">"","+33094063225","helene.dici@la.fr"</networkAccountId>
            <networkAccountId id="123456789">"+33098257276","",""</networkAccountId>
            <networkAccountId id="987654322">"","+33735633685","jossdela@gmal.com"</networkAccountId>
            <networkAccountId id="000001234">"+33000024957","",""</networkAccountId>
            <networkAccountId id="000897356">"+33783763117","+3246353440",""</networkAccountId>
            <networkAccountId id="8762543SD"></networkAccountId>
            <networkAccountId id="IdNo98376">"+33612600007","+33098235637",""</networkAccountId>
            <networkAccountId id="TestIdNo9">"","+33556736332",""</networkAccountId>
            <networkAccountId id="TestIdNo6"></networkAccountId>
        </feed>
    </batchNewResponse>
    et les 2 requêtes suivantes donne ce que je souhaite avoir , mais mon souci est de devoir faire 2 requêtes (donc 2 lectures du fichier XML)

    (TMP_DIR est un directory ORACLE ==> Create Or Replace Directory TMP_DIR as '/tmp/')

    cat Resp.sql
    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
    set pagesize 0
    set heading off
    Set linesize 400
    select x.* from XMLTable( '/batchNewResponse/entry'
                              passing xmltype( bfilename('TMP_DIR','Response.xml'),nls_charset_id('Windows-1251') )
                              columns
                                   no_file varchar2(300) path 'requestId'
                             ) x;
     
    select x.* from XMLTable( '/batchNewResponse/feed/networkAccountId'
                              passing xmltype( bfilename('TMP_DIR','Response.xml'),nls_charset_id('Windows-1251') )
                              columns
                                   id varchar2(10) path '@id',
                                   info varchar2(300) path '.'
                             ) x;
    le résultat attendu est ok mais mon problème est que je lis 2 fois le fichier
    (Sous Sqlplus)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @Resp.sql
    EN014383
     
    001234567  "+33025117528","",""
    000123456  "","+33094063225","helene.dici@la.fr"
    123456789  "+33098257276","",""
    987654322  "","+33735633685","jossdela@gmal.com"
    000001234  "+33000024957","",""
    000897356  "+33783763117","+3246353440",""
    8762543SD
    IdNo98376  "+33612600007","+33098235637",""
    TestIdNo9  "","+33556736332",""
    TestIdNo6
    Est il possible de faire une seule requete (Impliquant bien entendu 1 seule lecture du fichier) pour avoir le résultat suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    EN014383 001234567  "+33025117528","",""
    EN014383 000123456  "","+33094063225","helene.dici@la.fr"
    EN014383 123456789  "+33098257276","",""
    EN014383 987654322  "","+33735633685","jossdela@gmal.com"
    EN014383 000001234  "+33000024957","",""
    EN014383 000897356  "+33783763117","+3246353440",""
    EN014383 8762543SD
    EN014383 IdNo98376  "+33612600007","+33098235637",""
    EN014383 TestIdNo9  "","+33556736332",""
    EN014383 TestIdNo6
    Merci de votre aide
    @Argoet

  2. #2
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonjour,

    J'ai un peu cherché, et suis tombé sur quelquechose que j'ai pu adapter (merci stackoverflow ... ).
    Cela donnerait ceci:
    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
     
    select no_file, id, info from XMLTable( 'for $i in batchNewResponse/feed/networkAccountId
           return <row>
           {
              $i/@id
              , $i/../../entry/requestId
              , $i/../feed
           } 
           </row>' 
                              passing xmltype( bfilename('TMP_DIR','Response.xml'),nls_charset_id('Windows-1251') )
                              columns
                                    id varchar2(10) path '@id'
                                    , no_file varchar2(300) path 'requestId'
                                    , info varchar2(300) path '.'
                             ) x;
    Il y a peut être mieux, mais j'avoue que c'est la première fois que j'utilise ce genre de syntaxe; j'espère juste que cela pourra t'aider.
    Note qu'apparemment, tout ce qui est attribut - comme le "@id" - doit être passé en début sinon ca plante.

    Bref, c'est la première fois que je vois ce truc la, je suis curieux de pouvoir approfondir un peu.

    @+

  3. #3
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut
    Un grand Merci à vous SunChaser <En Mode> Je decouvre aussi cette syntaxe </En Mode>

    J'ai du modifier un little peu pour avoir le résultat souhaiter (no_file et info avait la meme valeur ) je n'ai pas compris l'interet du ==> "$i/../feed"
    et là , cela fonctionne (Ajout du <tag> "info" <info> { $i } </info> )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     Select no_file, id, info from XMLTable( 'for $i in batchNewResponse/feed/networkAccountId
           return <row>
           {
              $i/@id
            , $i/../../entry/requestId , 
            <info> { $i } </info>
           } 
           </row>' 
    passing xmltype( bfilename('TMP_DIR','Response.xml'),nls_charset_id('Windows-1251') )
                    columns
                         id varchar2(10) path '@id'
                     , info varchar2(300) path 'info'
                     , no_file varchar2(300) path 'requestId'
                    ) x;

  4. #4
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Salut,
    Oui, c'est vraiment un truc "bizarre", mais ca doit valoir le coup de savoir exactement quoi et comment faire avec cette syntaxe du premier argument de XMLTable.
    Je me demande bien ou trouver des infos la dessus d'ailleurs.
    Je sentais bien que cela serait une solution a ton problème, ce truc m'intéressait, donc je me suis dit que ca valait le coup de donner l'info même si je suis loin de tout comprendre a "comment ca marche".
    no_file et info avait la meme valeur
    Oui, désolé, j'avais fait une connerie sans m'en rendre compte
    Bien vu le coup des balises "<info>" ...

    @+

  5. #5
    Expert confirmé 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
    Par défaut
    Ma façon "standard" pour traiter ce type de requête est
    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
     
     Select x.no_file, 
            y.id,
            y.info
     from XMLTable('for $i in batchNewResponse
                    return $i'
                    passing xmltype( bfilename('ASTCMD','Reponse.xml'),nls_charset_id('Windows-1251') )
                                        columns no_file varchar2(300) path 'entry/requestId',
                                                feed    XMLType       path 'feed'
                  ) x,
          XMLTable('for $i in feed/networkAccountId 
                    return $i'
                    passing x.feed
                      columns id varchar2(10) path '@id',
                              info varchar2(300) path '/'
                  ) y
    Mais cela peut s'avérer assez couteuse sur un fichier important.
    Par contre la requête peut être simplifié comme suit
    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
     
     Select *
     from XMLTable( 'for $i in batchNewResponse/feed/networkAccountId
                     return <row>
                     {
                        $i,
                        $i/../../entry/requestId
                     } 
                     </row>' 
              passing xmltype( bfilename('ASTCMD','Reponse.xml'),nls_charset_id('Windows-1251') )
                              columns
                                a  xmltype path '/',                            
                                id varchar2(10) path 'networkAccountId/@id'
                               , info varchar2(300) path 'networkAccountId'
                               , no_file varchar2(300) path 'requestId'
                              ) x;
    ou la colonne a existe pour mieux comprendre comment cela fonctionne.

  6. #6
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut Je Tag Resolu
    Un grand merci à vous 2 Sunchaser et mnitu
    je tag [Resolu]

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

Discussions similaires

  1. [Utilisation] Peut-on versionner plusieurs fichiers en une seule fois ?
    Par llaffont dans le forum Subversion
    Réponses: 0
    Dernier message: 18/03/2011, 16h33
  2. lire un fichier en une seule fois
    Par ouinih dans le forum Langage
    Réponses: 2
    Dernier message: 25/03/2008, 18h30
  3. [C# 1.1/XML] Comment naviguer/lire un fichier XML ?
    Par Monstros Velu dans le forum C#
    Réponses: 1
    Dernier message: 15/06/2006, 13h54
  4. [C# 1.1/XML] Comment naviguer/lire un fichier XML ?
    Par Monstros Velu dans le forum C#
    Réponses: 2
    Dernier message: 07/06/2006, 18h57
  5. [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

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