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 :

Intégrer du XML directement dans la base de données [11g]


Sujet :

SQL Oracle

  1. #1
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut Intégrer du XML directement dans la base de données
    Bonjour,

    Voici le problème, j'ai un fichier xml que j'essaie d'intégrer dans une table.


    Sur un xml simple, cela 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
    select
    mon_xml_parse.* from
    xmltable('$e/Agent' passing xmlparse(content '
       <Agent>
       <Matricule>000000</Matricule>
        <PrecompteObligatoire>
          <Type>VCN</Type>
          <Nature>OUV</Nature>
          <Reliquat>3600,61</Reliquat>
        </PrecompteObligatoire>
        </Agent>
        <Agent>
         <Matricule>000001</Matricule>
        <PrecompteObligatoire>
          <Type>PAT</Type>
          <Nature>OUV</Nature>
          <Reliquat>3600,61</Reliquat>
        </PrecompteObligatoire>
        </Agent>') as "e"
    columns matric char(6) path 'Matricule',
    phtype char(3) path 'PrecompteObligatoire/Type',
    nature char(3) path 'PrecompteObligatoire/Nature',
    reliquat  number(18,2) path 'PrecompteObligatoire/Reliquat'
    ) mon_xml_parse;
    Par contre j'ai du modifié mon xml.

    Si mon xml est comme ceci ça ne marche plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       <Agent>
       <Matricule>000000</Matricule>
        <PrecompteObligatoire>
          <Type>VCN</Type>
          <Nature>OUV</Nature>
          <Reliquat>3600,61</Reliquat>
        </PrecompteObligatoire>
        <Matricule>000001</Matricule>
        <PrecompteObligatoire>
          <Type>PAT</Type>
          <Nature>OUV</Nature>
          <Reliquat>3600,61</Reliquat>
        </PrecompteObligatoire>
        </Agent>'
    je récupère cette erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ORA-19279: XPTY0004 - non-concordance de type dynamique XQuery : attente d'une séquence mono-élément - obtention d'une séquence multi-élément
    19279. 00000 -  "XQuery dynamic type mismatch: expected singleton sequence - got multi-item sequence" 
    *Cause:    The XQuery sequence passed in had more than one item.
    *Action:   Correct the XQuery expression to return a single item sequence.

    Autre point, le xml de départ est codé comme suit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Matricule V="000000"/>
    et non pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Matricule>000000</Matricule>
    mais il ne sait pas lire la première forme et me sort Null.

    Avez-vous des idées?
    ours ours !! Au début elle est froide mais après elle est bonne!

  2. #2
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut
    Bon j'ai solutionné plusieurs problèmes mais je m'en suis créé des nouveaux.

    le path refuse les expressions du genre '../MaBalise'

    Sinon pour le reste j'ai fait

    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
    70
    71
    72
    73
    select
    mon_xml_parse.* from
    xmltable('$e/DocPaye/Agent/PrecompteObligatoire' passing xmlparse(content '
    <DocPaye>
      <Annee V="2014"/>
      <Mois V="--03--"/>
      <CodeEh V="19081"/>
      <Agent origine="paie">
        <Matricule V="000000"/>
        <PrecompteObligatoire>
          <Type V="VCN"/>
          <Nature V="OUV"/>
          <Reliquat V="3600,61"/>
          <ValIni V="4698,01"/>
          <Montant V="109,74"/>
        </PrecompteObligatoire>
      </Agent>
      <Agent origine="paie">
        <Matricule V="000001"/>
        <PrecompteObligatoire>
          <Type V="SAR"/>
          <Nature V="PRC"/>
          <Reliquat V="5200,97"/>
          <ValIni V="6507,28"/>
          <Montant V="187,03"/>
        </PrecompteObligatoire>
      </Agent>
      <Agent origine="paie">
        <Matricule V="000002"/>
        <PrecompteObligatoire>
          <Type V="VCN"/>
          <Nature V="OUV"/>
          <Reliquat V="543,15"/>
          <ValIni V="5822,67"/>
          <Montant V="128,91"/>
        </PrecompteObligatoire>
      </Agent>
      <Agent origine="paie">
        <Matricule V="000003"/>
        <PrecompteObligatoire>
          <Type V="SAR"/>
          <Nature V="PRC"/>
          <Reliquat V="1038,85"/>
          <ValIni V="1259"/>
          <Montant V="95,84"/>
        </PrecompteObligatoire>
      </Agent>
      <Agent origine="paie">
        <Matricule V="000004"/>
        <PrecompteObligatoire>
          <Type V="SAR"/>
          <Nature V="ALM"/>
          <Reliquat V="0"/>
          <ValIni V="179,16"/>
          <Montant V="179,16"/>
        </PrecompteObligatoire>
        <PrecompteObligatoire>
          <Type V="SAR"/>
          <Nature V="PRC"/>
          <Reliquat V="7786,96"/>
          <ValIni V="19245,88"/>
          <Montant V="136,64"/>
        </PrecompteObligatoire>
      </Agent>  
    </DocPaye>') as "e"
    columns codhop char(3) path '../..CodeEh/@V',
    matric char(3) path '../Matricule/@V',
    phtype char(3) path 'Type/@V',
    nature char(3) path 'Nature/@V',
    valini char(10) path 'ValIni/@V',
    reliquat  number(18,2) path 'Reliquat/@V',
    montant number(18,2) path 'Montant/@V'
    ) mon_xml_parse;
    Il reste donc le problème sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    columns codhop char(3) path '../..CodeEh/@V',
    matric char(3) path '../Matricule/@V',
    ours ours !! Au début elle est froide mais après elle est bonne!

  3. #3
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    J'ai l'impression que vous voulez en fait faire quelque chose de ce type
    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
     
    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 
    Connected as system
     
    SQL> 
    SQL> With Data As (
      2  Select XmlType('
      3  <Agent>
      4     <Group>
      5     <Matricule V="000000"/>
      6      <PrecompteObligatoire>
      7        <Type>VCN</Type>
      8        <Nature>OUV</Nature>
      9        <Reliquat>3600,61</Reliquat>
     10      </PrecompteObligatoire>
     11     </Group>
     12     <Group>
     13      <Matricule V="000001"/>
     14      <PrecompteObligatoire>
     15        <Type>PAT</Type>
     16        <Nature>OUV</Nature>
     17        <Reliquat>3601,61</Reliquat>
     18      </PrecompteObligatoire>
     19     </Group>
     20  </Agent>') x_el
     21  From dual
     22  )
     23  Select a.*
     24    From Data t,
     25         XMLTable('$e/Agent/Group'
     26                   passing t.x_el As "e"
     27                   COLUMNS
     28                           Matricule  varchar2(10) Path 'Matricule/@V',
     29                           Type       varchar2(10) Path 'PrecompteObligatoire/Type',
     30                           Nature     varchar2(10) Path 'PrecompteObligatoire/Nature',
     31                           Reliquat   varchar2(10) Path 'PrecompteObligatoire/Reliquat'
     32                  ) a
     33  /
     
    MATRICULE  TYPE       NATURE     RELIQUAT
    ---------- ---------- ---------- ----------
    000000     VCN        OUV        3600,61
    000001     PAT        OUV        3601,61
     
    SQL>

  4. #4
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut
    En fait le xml que l'on me fournit est figé.

    Il est de type

    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
    <DocPaye>
                            <Année> </Année>                     
                            <Agent>
                                  <Matricule V="000000"/>
                                  <PrecompteObligatoire>
                                              <Type V="VCN"/>
                                              <Nature V="OUV"/>
                                              <Reliquat V="3600,61"/>
                                              <ValIni V="4698,01"/>
                                              <Montant V="109,74"/>
                                  </PrecompteObligatoire>
                           </Agent>
                           <Agent>
                                  <Matricule V="000001"/>
                                  <PrecompteObligatoire>
                                              <Type V="SAR"/>
                                              <Nature V="PRC"/>
                                              <Reliquat V="5200,97"/>
                                              <ValIni V="6507,28"/>
                                              <Montant V="187,03"/>
                                  </PrecompteObligatoire>
                                  <PrecompteObligatoire>
                                              <Type V="TET"/>
                                              <Nature V="PRC"/>
                                              <Reliquat V="5200,97"/>
                                              <ValIni V="6507,28"/>
                                              <Montant V="187,03"/>
                                   </PrecompteObligatoire>
                            </Agent>
    </DocPaye>

    Je peux avoir plusieurs Précompte pour un Matricule.


    Si mon chemin de départ s'arrête à Agent j'ai une erreur XQuery sur le nombre de résultats possibles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ORA-19279: XPTY0004 - non-concordance de type dynamique XQuery : attente d'une séquence mono-élément - obtention d'une séquence multi-élément
    19279. 00000 -  "XQuery dynamic type mismatch: expected singleton sequence - got multi-item sequence" 
    *Cause:    The XQuery sequence passed in had more than one item.
    *Action:   Correct the XQuery expression to return a single item sequence.
    Par contre si je descends le chemin initial jusque Précompte, ma requête passe mais je n'ai pas le Matricule. J'ai toujours null.

    Si j'essaie de remonter dans l'arbo via le path sur Matricule:

    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
    select
    mon_xml_parse.* from
    xmltable('$e/DocPaye/Agent/PrecompteObligatoire' passing xmlparse(content '
    <DocPaye>
      <Agent origine="paie">
        <Matricule V="000000"/>
        <PrecompteObligatoire>
          <Type V="VCN"/>
          <Nature V="OUV"/>
          <Reliquat V="3600,61"/>
          <ValIni V="4698,01"/>
          <Montant V="109,74"/>
        </PrecompteObligatoire>
      </Agent>
      <Agent origine="paie">
        <Matricule V="000001"/>
        <PrecompteObligatoire>
          <Type V="SAR"/>
          <Nature V="PRC"/>
          <Reliquat V="5200,97"/>
          <ValIni V="6507,28"/>
          <Montant V="187,03"/>
        </PrecompteObligatoire>
        <PrecompteObligatoire>
          <Type V="TET"/>
          <Nature V="PRC"/>
          <Reliquat V="5200,97"/>
          <ValIni V="6507,28"/>
          <Montant V="187,03"/>
        </PrecompteObligatoire>
      </Agent>
    </DocPaye>') as "e"
    columns 
    matric char(6) path '../Matricule/@V',
    phtype char(3) path 'Type/@V',
    nature char(3) path 'Nature/@V',
    valini char(10) path 'ValIni/@V',
    reliquat  number(18,2) path 'Reliquat/@V',
    montant number(18,2) path 'Montant/@V'
    ) mon_xml_parse;

    J'ai le message suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ORA-19110: expression XQuery non prise en charge
    19110. 00000 -  "unsupported XQuery expression"
    *Cause:    The program specified an XQuery expression that is not supported.
    *Action:   Rewrite the XQuery with a expression that is supported.
    Erreur à la ligne 3, colonne 1
    Il ne reconnaît pas le ../ on dirait.

    D'après ce que j'ai vu sur le WEB ça devrait passer.
    ours ours !! Au début elle est froide mais après elle est bonne!

  5. #5
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par pmboutteau Voir le message
    ...
    Je peux avoir plusieurs Précompte pour un Matricule.
    ...
    Alors je pense que votre fichier devrait être structuré comme ça:
    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
     
     <Agent>
            <Matricule V="000000">
              <PrecompteObligatoire>
                          <Type V="VCN"/>
                          <Nature V="OUV"/>
                          <Reliquat V="3600,61"/>
                          <ValIni V="4698,01"/>
                          <Montant V="109,74"/>
              </PrecompteObligatoire>
              <PrecompteObligatoire>
                          <Type V="PAT"/>
                          <Nature V="OUV"/>
                          <Reliquat V="3600,61"/>
                          <ValIni V="4700,00"/>
                          <Montant V="100,11"/>
              </PrecompteObligatoire>
            </Matricule>
     </Agent>
    Actuellement vous avez plusieurs Précompte pour un Agent.

  6. #6
    Membre averti Avatar de pmboutteau
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Février 2005
    Messages : 601
    Points : 420
    Points
    420
    Par défaut
    En fait je ne peux pas modifier le .xml.

    Je pourrais le transcoder pour l'avoir à un autre format mais j'ai trouvé comment faire en 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
    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
    70
    71
    72
    select X.MATRIC, Y.*
    from       xmltable('/DocPaye/Agent'
                         passing xmlparse (content'
    <DocPaye>
      <Annee V="2014"/>
      <Mois V="--03--"/>
      <CodeEh V="19081"/>
      <Agent origine="paie">
        <Matricule V="000000"/>
        <PrecompteObligatoire>
          <Type V="VCN"/>
          <Nature V="OUV"/>
          <Reliquat V="3600,61"/>
          <ValIni V="4698,01"/>
          <Montant V="109,74"/>
        </PrecompteObligatoire>
      </Agent>
      <Agent origine="paie">
        <Matricule V="000001"/>
        <PrecompteObligatoire>
          <Type V="SAR"/>
          <Nature V="PRC"/>
          <Reliquat V="5200,97"/>
          <ValIni V="6507,28"/>
          <Montant V="187,03"/>
        </PrecompteObligatoire>
      </Agent>
      <Agent origine="paie">
        <Matricule V="000002"/>
        <PrecompteObligatoire>
          <Type V="VCN"/>
          <Nature V="OUV"/>
          <Reliquat V="543,15"/>
          <ValIni V="5822,67"/>
          <Montant V="128,91"/>
        </PrecompteObligatoire>
      </Agent>
      <Agent origine="paie">
        <Matricule V="000003"/>
        <PrecompteObligatoire>
          <Type V="SAR"/>
          <Nature V="PRC"/>
          <Reliquat V="1038,85"/>
          <ValIni V="1259"/>
          <Montant V="95,84"/>
        </PrecompteObligatoire>
      </Agent>
      <Agent origine="paie">
        <Matricule V="000004"/>
        <PrecompteObligatoire>
          <Type V="SAR"/>
          <Nature V="ALM"/>
          <Reliquat V="0"/>
          <ValIni V="179,16"/>
          <Montant V="179,16"/>
        </PrecompteObligatoire>
        <PrecompteObligatoire>
          <Type V="SAR"/>
          <Nature V="PRC"/>
          <Reliquat V="7786,96"/>
          <ValIni V="19245,88"/>
          <Montant V="136,64"/>
        </PrecompteObligatoire>
      </Agent>  
    </DocPaye>')
    columns MATRIC char(6) path './Matricule/@V', PRECOMPTE xmltype path './PrecompteObligatoire') X
    ,xmltable('/PrecompteObligatoire' passing X.PRECOMPTE 
    columns PHTYPE char(3) path './Type/@V',
    nature char(3) path 'Nature/@V',
    valini char(10) path 'ValIni/@V',
    reliquat  number(18,2) path 'Reliquat/@V',
    montant number(18,2) path 'Montant/@V') (+) Y;
    Avec la jointure ça marche Nickel.

    Merci pour ton aide.
    ours ours !! Au début elle est froide mais après elle est bonne!

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

Discussions similaires

  1. [AC-2007] Intégrer le xml d'un ruban personnalisé dans la base de données
    Par Arkham46 dans le forum Contribuez
    Réponses: 2
    Dernier message: 30/12/2019, 21h08
  2. Sérialiser un objet directement dans une base de données
    Par Kehel dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 22/08/2008, 09h45
  3. Stoquer dans un fichier XML ou dans une base de données ?
    Par ludovic tambour dans le forum Décisions SGBD
    Réponses: 10
    Dernier message: 15/11/2007, 11h02
  4. intégrer un fichier image dans une base de donnée?
    Par Lody dans le forum Requêtes
    Réponses: 9
    Dernier message: 16/03/2006, 19h08
  5. [Strategie][Java][XML] Import dans une base de données
    Par nad dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 23/09/2002, 11h12

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