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 :

XMLTable et multi éléments


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2021
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2021
    Messages : 20
    Par défaut XMLTable et multi éléments
    Bonjour, j'ai un petit soucis avec l'utilisation de XML Table ! Je souhaite récupérer le contenu d'un XML, et donc j'utilise pour ça XMLTable.
    J'ai un XML avec pour construction
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <Document>
    <AccountInfo>
    <blabla> </blabla>
    <blabla2> </blabla2>
    </accountInfo>
    <Ntry>
    <Amount></Amount>
    </Ntry>
    <Ntry>
    <amount></Amount>
    </Ntry>
    </document>


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT bla.message_1,
           bla.message_2,
    bla.amount
    FROM   blabla bla,
           xmltable(xmlnamespaces(DEFAULT 'blabla'), '/Document' passing src.contenu columns message_1 varchar2(50) path 'AccountInfo/blabla', message_2 varchar2(50) path 'AccountInfo/blabla2', amount varchar2(20) path 'Ntry/Amount' ;

    Et en fait, quand j'ai rédigé ma requête, j'ai une erreur "ORA 19279- attente d'une séquence mono élément, obtention d'une séquence multi élément" et je pense que c'est parce que Ntry est présent en plusieurs fois (ma requête fonctionne proprement si il n'y a qu'un seul Ntry dans le XML. Comment faire pour récupérer plusieurs lignes, en sachant qu'il y a différents Ntry et un seul AccountInfo ? Sur le net, je n'ai pas trouvé de pistes très claires, j'ai vu des jointures d'autres XML tables avec Left Join ou cross join mais je n'ai pas réussi à le reproduire.

    Merci d'avance pour votre aide !

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Bonjour,

    Puisque tu as plusieurs occurrences de Amount ta colonne sera du type xmltype. Tu devras donc faire 2 xmltable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT bla.message_1,
           bla.message_2,
           blabla.amount
    FROM   xml_data src,
           xmltable('/Document' 
                    passing src.contenu 
                    columns message_1 varchar2(50) path './AccountInfo/blabla', 
                            message_2 varchar2(50) path './AccountInfo/blabla2', 
                            amounts   xmltype      path './Ntry/Amount') bla,
           xmltable('./Amount'
                    passing bla.amounts
                    columns amount varchar2(20) path '.'              
                   ) blabla

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2021
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2021
    Messages : 20
    Par défaut
    Salut ! D'abord merci pour ta réponse. C'est bien ce que j'avais cru comprendre. Dans le cas ou Ntry contient plusieurs tags, est-ce que je suis obligé de faire un xmltable par champ que je veux récupérer ? En fait, j'aimerai bien faire :


    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 bla.message_1,
           bla.message_2,
           blabla.amount
    FROM   xml_data src,
           xmltable('/Document' 
                    passing src.contenu 
                    columns message_1 varchar2(50) path './AccountInfo/blabla', 
                            message_2 varchar2(50) path './AccountInfo/blabla2', 
                            Ntry xmltype      path './Ntry') bla,
           xmltable('./Ntry'
                    passing bla.Ntry
                    columns amount varchar2(20) path './Amount'
                                 test2     varchar2(20) path './Test2'
                                 test3      varchar2(20) path './Test3'           
                   ) blabla
    Malheureusement, quand j'essaie de faire comme cela, je n'ai plus de résultat tout court, y compris de ma premiére table, pourtant correcte.

    Merci d'avance !

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Bizarre, ça devrait fonctionner. Tes balises sont bien au même niveau que <Amount> sous <Ntry> ?

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2021
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2021
    Messages : 20
    Par défaut
    Pas forcément, mais j'adapte le chemin en conséquences et ça ne marche pas.

    Et si j'essaie juste de récupérer le montant, avec deux xmltables différentes ça ne marche pas non plus, ça ne me renvoie aucune ligne.


    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
    SELECT xt.message_date,
                       xt.bic,
                      xt.owner_name,
                      xt.owner_iban,
                     xt2.montant_ecriture
                  FROM blabla src,
                  xmltable(xmlnamespaces(default 'urn:iso:std:iso:20022:tech:xsd:camt.054.001.02'), '/Document/BkToCstmrDbtCdtNtfctn' passing xmltype(src.contenu) columns
                                message_date varchar2(50) path './GrpHdr/CreDtTm',
                                bic VARCHAR2(12) path './Ntfctn/Acct/Svcr/FinInstnId/BIC',
                                owner_name varchar2(50) path './Ntfctn/Acct/Nm',
                                owner_iban varchar2(40) path './Ntfctn/Acct/Id/IBAN',
                                Entry xmltype path './Ntfctn/Ntry'
                               )xt,                      
                              xmltable(
                           xmlnamespaces(default 'urn:iso:std:iso:20022:tech:sd:camt.054.001.02'),'/Ntry' passing xt.Entry
                            columns 
                            montant_ecriture varchar2(10) path './Amt'
                             ) xt2
    Voici un code plus en détail de ce que j'essaei de faire avec la seconde table. La premiére table récupère correctement les infos, mais dés que je rajoute la deuxième pour les champs dans Ntry, ma requête ne renvoie plus de lignes.

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Avec un jeu de données basique ça 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    with xml_data as (select xmltype('<Document>
    <AccountInfo>
    <blabla>msg1</blabla>
    <blabla2>msg2</blabla2>
    </AccountInfo>
    <Ntry>
    <Test1>t01</Test1>
    <Test2>t02</Test2>
    <Amount>123</Amount>
    </Ntry>
    <Ntry>
    <Test1>t1</Test1>
    <Test2>t2</Test2>
    <Amount>456</Amount>
    </Ntry>
    </Document>') contenu from dual
    )
    SELECT bla.message_1,
           bla.message_2,
           blabla.amount,
           blabla.test1,
           blabla.test2
    FROM   xml_data src,
           xmltable('/Document' 
                    passing src.contenu 
                    columns message_1 varchar2(50) path './AccountInfo/blabla', 
                            message_2 varchar2(50) path './AccountInfo/blabla2', 
                            amounts   xmltype      path './Ntry') bla,
           xmltable('./Ntry'
                    passing bla.amounts
                    columns amount varchar2(20) path './Amount',
                            test1  varchar2(20) path './Test1',
                            test2  varchar2(20) path './Test2'
                   ) blabla    ;

    msg1 msg2 123 t01 t02
    msg1 msg2 456 t1 t2

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

Discussions similaires

  1. insertBefore multi éléments
    Par scargot dans le forum jQuery
    Réponses: 4
    Dernier message: 15/11/2017, 09h31
  2. Réponses: 1
    Dernier message: 29/08/2008, 09h44
  3. [multi map] supprimer des éléments
    Par poukill dans le forum SL & STL
    Réponses: 3
    Dernier message: 22/05/2007, 12h17
  4. [multi map] supprimer des éléments
    Par poukill dans le forum C++
    Réponses: 3
    Dernier message: 22/05/2007, 12h17
  5. Ajout champs multi-éléments
    Par Terminator dans le forum Access
    Réponses: 4
    Dernier message: 08/02/2007, 19h30

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