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 :

Extraction de données d'un fichier XML [12c]


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut Extraction de données d'un fichier XML
    Bonjour,

    Je dois extraire des données d'un fichier XML pour les intégrer dans ma base de données.
    J'insère le fichier dans une colonne de type XMLTYPE d'une table de travail avec SQL*Loader.
    Jusque là, j'ai réusssi à m'en sortir avec la structure de ce fichier mais là je sèche.

    La structure du document qui me pose problème est la suivante :
    Code xml : 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
    <Portefeuille>
        <Client>
            <Identifiant>345</Identifiant>
            <Adresse>
                <Type>PERS</Type>
                <Ligne>18, rue du Chat Qui Pêche</Ligne>
                <Ligne>Appt 21</Ligne>
                <Ligne></Ligne>
                <Ligne></Ligne>
                <Ville>TRIFOUILLY</Ville>
            <Adresse/>
            <Adresse>
                <Type>PRO</Type>
                <Ligne>A.C.M.E</Ligne>
                <Ligne>Direction Financière</Ligne>
                <Ligne>20, rue Montgolfier</Ligne>
                <Ligne></Ligne>
                <Ville>AILLEURS Lez TRIFOUILLY</Ville>
            <Adresse/>
        </Client>
        <Client>
          ....
        </Client>
    </Portefeuille>

    J'arrive bien à extraire les données du client et les composantes de l'adresse mais je bloque sur les lignes de l'adresse :
    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
    insert into ADRESSE
    select  CLT.ID_CLIENT
        ,   ADR.TYPE_ADRESSE
        ,   ADR.VILLE
        ,   listagg(LGN.LIGNE, CHR(10)) 
                within group (order by LGN.ORDRE)    as LIGNES
    from    XML_IMPORT  SRC
        ,   xmltable
                (   '/Portefeuille/Client'   passing SRC.XML_DATA
                columns
                    ID_CLIENT               path    '/Identifiant'
                ,   ADRESSE         xmltype path    '/Adresse'
                )   CLT
        ,   xmltable
                (   '/Adresse'  passing CLT.ADRESSE
                columns
                    TYPE_ADRESSE            path    '/Type'
                ,   VILLE                   path    '/Ville'
                ,   LIGNES          xmltype path    '/Ligne'
                )   ADR
        ,   xmltable
                (   '???'       passing ADR.LIGNES
                columns
                    LIGNE                   path    '???'
                ,   ORDRE                   path    '???'
                )   LGN
    where   LGN.LIGNE   is not null
    group by    CLT.ID_CLIENT
        ,   ADR.TYPE_ADRESSE
        ,   ADR.VILLE
    ;
    Quelqu'un serait-il plus à l'aise que moi pour manipuler les fichiers XML ?
    Précision, je suis en 12.1.

    PS: Inutile de me faire remarquer que le stockage de l'adresse dans la base n'est pas optimal. Je le sais et je me bats pour le modifier
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  2. #2
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Bonjour bonjour,

    Je ne sais pas si cela pourrait t'aider, ne l'ayant jamais testé, mais la clause XMLAGG ne pourrait-elle pas t'aider ici ?
    https://docs.oracle.com/cd/B19306_01...nctions215.htm

    En la mettant dans ta "table" lig voir même pourquoi pas dans ta table ADR ?

    (C'est vrai que c'est moche pour l'adresse, j'espére que tu y arriveras )

    Bisous

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Salut Al1,

    Je connais pas trop XML car je ne l'utilise pas, mais j'ai réussi à faire un truc.

    1/ J'ai du modifier ton XML car il me sortait en erreur (sur les / en fin de client/ au lieu de /client et sur d'autres)
    2/ J'ai trouvé le ORDINALITY (par contre obligé de le mettre sur chaque XMLTABLE)

    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
    CREATE TABLE wmc(a XMLTYPE)
     
     
    INSERT INTO wmc
    VALUES('<Portefeuille>
        <Client>
            <Identifiant>345</Identifiant>
            <Adresse>
                <Type>PERS</Type>
                <Ligne>18, rue du Chat Qui Pêche</Ligne>
                <Ligne>Appt 21</Ligne>
                <Ligne></Ligne>
                <Ligne></Ligne>
                <Ville>TRIFOUILLY</Ville>
            </Adresse>
            <Adresse>
                <Type>PRO</Type>
                <Ligne>A.C.M.E</Ligne>
                <Ligne>Direction Financière</Ligne>
                <Ligne>20, rue Montgolfier</Ligne>
                <Ligne></Ligne>
                <Ville>AILLEURS Lez TRIFOUILLY</Ville>
            </Adresse>
        </Client>
    	<Client>
            <Identifiant>346</Identifiant>
            <Adresse>
                <Type>xPERS</Type>
                <Ligne>x18, rue du Chat Qui Pêche</Ligne>
                <Ligne>xAppt 21</Ligne>
                <Ligne></Ligne>
                <Ligne></Ligne>
                <Ville>TRIFOUILLY</Ville>
            </Adresse>
            <Adresse>
                <Type>xPRO</Type>
                <Ligne>xA.C.M.E</Ligne>
                <Ligne>xDirection Financière</Ligne>
                <Ligne>x20, rue Montgolfier</Ligne>
                <Ligne></Ligne>
                <Ville>xAILLEURS Lez TRIFOUILLY</Ville>
            </Adresse>
        </Client>
     </Portefeuille>')

    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
    SELECT  noligCli, noligAdr, CLT.ID_CLIENT, ADR.TYPE_ADRESSE, ADR.VILLE, listagg(LGN.LIGNE, CHR(10)) WITHIN GROUP (ORDER BY LGN.noligligne)    AS LIGNES
    FROM    wmc  SRC
        ,   XMLTABLE
                (   '/Portefeuille/Client'   PASSING SRC.a
                COLUMNS
                		noligCli FOR ORDINALITY,
                    ID_CLIENT               PATH    'Identifiant'
                ,   ADRESSE         XMLTYPE PATH    'Adresse'
                )   CLT, 
       XMLTABLE
                (   '/Adresse'  PASSING CLT.ADRESSE
                COLUMNS
                 noligAdr FOR ORDINALITY,
                       TYPE_ADRESSE            PATH    'Type'
                ,   VILLE                   PATH    'Ville'
                ,   LIGNES          XMLTYPE PATH    'Ligne'
                )   ADR
       ,   XMLTABLE
                (   '/Ligne'       PASSING ADR.LIGNES
                COLUMNS
    						   noligligne FOR ORDINALITY,
                		 LIGNE                   PATH    '/Ligne'
                 )   LGN
    GROUP BY noligCli, noligAdr, CLT.ID_CLIENT, ADR.TYPE_ADRESSE, ADR.VILLE
    Résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    NOLIGCLI	NOLIGADR	ID_CLIENT	TYPE_ADRESSE	VILLE	LIGNES
    1	1	345	PERS	TRIFOUILLY	18, rue du Chat Qui Pêche
    Appt 21
    1	2	345	PRO	AILLEURS Lez TRIFOUILLY	A.C.M.E
    Direction Financière
    20, rue Montgolfier
    2	1	346	xPERS	TRIFOUILLY	x18, rue du Chat Qui Pêche
    xAppt 21
    2	2	346	xPRO	xAILLEURS Lez TRIFOUILLY	xA.C.M.E
    xDirection Financière
    x20, rue Montgolfier

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    @JeanYvette : Merci de t'être penché sur mon problème, mais la fonction XMLAGG ne répond pas à mon besoin.

    Citation Envoyé par McM Voir le message
    1/ J'ai du modifier ton XML car il me sortait en erreur (sur les / en fin de client/ au lieu de /client et sur d'autres)
    Cela ne m'étonne pas vraiment. J'ai monté un fichier d'exemple un peu rapidement pour poster ma question parce que le fichier d'origine est beaucoup plus complexe.

    Citation Envoyé par McM Voir le message
    2/ J'ai trouvé le ORDINALITY (par contre obligé de le mettre sur chaque XMLTABLE)
    (...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       ,   XMLTABLE
                (   '/Ligne'       PASSING ADR.LIGNES
                COLUMNS
    						   noligligne FOR ORDINALITY,
                		 LIGNE                   PATH    '/Ligne'
                 )   LGN
    Merci Mcm, tu m'as débloqué.
    Je pensais avoir testé toutes les combinaisons possibles de / et de Ligne et j'étais passé à côté de celle-là...
    Quant à ORDINALITY, j'avoue être passé à côté au milieu de la documentation. Et c'est ce qui me manquait.

    Je ne pose de questions sur le forum que lorsque je pense vraiment avoir tout testé ou quand c'est vraiment en dehors de mon domaine de compétences.
    Je devrais le faire plus souvent, je gagnerais du temps
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Content de t'avoir aidé

    Citation Envoyé par al1_24 Voir le message
    Je ne pose de questions sur le forum que lorsque je pense vraiment avoir tout testé ou quand c'est vraiment en dehors de mon domaine de compétences.
    Je devrais le faire plus souvent, je gagnerais du temps
    Faut pas hésiter à poster des questions, ça permet aussi à d'autres de trouver des réponses en parcourant le forum.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Je plussoie, je ne connaissais pas non plus !

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

Discussions similaires

  1. dbms_xmlDom : Extraction de données d'un fichier XML
    Par akkyshan dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 05/02/2014, 15h02
  2. Extraction de données d'un fichier XML
    Par leconteconte dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2012, 10h04
  3. Extraction de données d'un fichier XML
    Par seco102 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 27/10/2011, 12h16
  4. [débutant]extraction des données d'un fichier xml simple
    Par ekram dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 14/03/2007, 12h24
  5. Extraction de donnés dans un fichier XML
    Par ANISSS dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 27/01/2006, 13h16

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