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 :

Problème XMLTABLE avec un grand fichier XML


Sujet :

PL/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 Problème XMLTABLE avec un grand fichier XML
    Bonjour,

    J'ai un programme qui m'intègre très bien du xml dans des tables Oracle.

    Par contre je viens de tester avec un plus gros fichier xml et j'ai l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-01704: string literal too long
    J'ai regardé pour essayer d'utiliser une bind variable mais ça n'a pas fonctionné (ou j'ai mal codé )

    Quelqu'un connait la problématique?
    ours ours !! Au début elle est froide mais après elle est bonne!

  2. #2
    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
    01704, 00000, "string literal too long"
    // *Cause: The string literal is longer than 4000 characters.
    // *Action: Use a string literal of at most 4000 characters.
    // Longer values may only be entered using bind variables.

  3. #3
    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
    Oui j'ai vu pour les 4000 caractères mais j'ai essayé d'utiliser une bind variable mais ça ne me fait rien.

    J'ai testé comme ceci pour voir

    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
    variable contenu varchar2
     
    execute :contenu:='<DocPaye><Annee V="2014"/><Mois V="--04--"/><CodeEh V="19081"/><Agent origine="paie"><Matricule V="006574"/><PrecompteObligatoire><Type V="VCN"/><Nature V="OUV"/><Reliquat V="4005.03"/><ValIni V="4699.59"/><Montant V="115.76"/></PrecompteObligatoire></Agent></DocPaye>'
     
    select X.MATRIC, Y.PHTYPE,Y.NATURE,
    to_number(RELIQUAT),to_number(Montant)
    from
    xmltable('/DocPaye/Agent' passing xmlparse (content':contenu') 
    columns MATRIC char(6) path './Matricule/@V', PRECOMPTE xmltype path './PrecompteObligatoire') X
    ,xmltable('/PrecompteObligatoire' passing X.PRECOMPTE
    columns PHTYPE char(3) path './Nature/@V',
    nature char(3) path 'Type/@V',
    valini char(10) path 'ValIni/@V',
    reliquat  char(18) path 'Reliquat/@V',
    montant char(18) path 'Montant/@V') (+) Y;
    et là ma requète m'affiche une table vide. Le contenu de contenu n'est pas interprété on dirait.

    J'ai essayé aussi avec clob mais je ne maitrise pas du tout.
    ours ours !! Au début elle est froide mais après elle est bonne!

  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
    Je viens d'essayer cela mais je ne comprends pas ce qu'il me fait.

    Mon insert ne marche pas et sqlplus me donne la main sur une valeur 22 .

    Voici le code que j'ai testé

    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
    CREATE OR REPLACE directory W_DIR AS '/dvagirh/dev/14.0/site/edition';
    GRANT READ,WRITE ON DIRECTORY W_DIR to public;
     
    DECLARE
    acct_doc xmltype := xmltype( bfilename('W_DIR','DocPaye.SARVCN.19081.201404.xml'), nls_charset_id('AL32UTF8') );
     
    BEGIN
     
    insert into xml_retph7
      select '081',X.MATRIC, Y.PHTYPE,Y.NATURE,
      to_number(RELIQUAT),to_number(Montant)
      from
      xmltable('/DocPaye/Agent' passing xmlparse acct_doc
                columns MATRIC char(6) path './Matricule/@V',
                        PRECOMPTE xmltype path './PrecompteObligatoire') X
      ,xmltable('/PrecompteObligatoire' passing X.PRECOMPTE
                columns PHTYPE char(3) path './Nature/@V',
                        nature char(3) path 'Type/@V',
                        valini char(10) path 'ValIni/@V',
                        reliquat  char(18) path 'Reliquat/@V',
                        montant char(18) path 'Montant/@V') (+) Y;
    END;
     
    EXIT;
    et voici le résultat sous la console UNIX quand je le lance avec sqlplus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL> @volumeBFILE
     
    Directory created.
     
     
    Grant succeeded.
     
     22
    Je dois ensuite sortir
    ours ours !! Au début elle est froide mais après elle est bonne!

  5. #5
    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 trouvé mais je ne sais pas si c'est propre propre

    Voici le code:

    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
    CREATE OR REPLACE directory W_DIR AS '/dvagirh/dev/14.0/site/edition';
    GRANT READ,WRITE ON DIRECTORY W_DIR to public;
    ALTER session SET nls_numeric_characters=', ';
    insert into xml_retph7(
    select '081',MATRIC,PHTYPE,NATURE,to_number(RELIQUAT),to_number(MONTANT) from(
    WITH DATA AS (SELECT XMLTYPE(BFILENAME('W_DIR','DocPaye.SARVCN.19081.201404.xml'), NLS_CHARSET_ID('UTF8')) x_el FROM dual)
     select '081',X.MATRIC,Y.PHTYPE,Y.NATURE,Y.RELIQUAT,Y.MONTANT
      from data t,xmltable('$e/DocPaye/Agent' passing t.x_el as "e"
                columns MATRIC char(6) path './Matricule/@V',
                        PRECOMPTE xmltype path './PrecompteObligatoire') X
                ,xmltable ('/PrecompteObligatoire' passing X.PRECOMPTE
                columns PHTYPE char(3) path './Nature/@V',
                        nature char(3) path 'Type/@V',
                        valini char(10) path 'ValIni/@V',
                        reliquat char(18) path 'Reliquat/@V',
                        montant char(18) path 'Montant/@V') (+) Y));
    J'ai du ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER session SET nls_numeric_characters=', ';
    car le to_number ne passait pas (mais il passait avant, c'est le 'UTF8' dans le BFILENAME qui provoque cela?

    et ensuite je suis obligé de doubler ma ligne?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select '081',MATRIC,PHTYPE,NATURE,to_number(RELIQUAT),to_number(MONTANT) from(
    WITH DATA AS (SELECT XMLTYPE(BFILENAME('W_DIR','DocPaye.SARVCN.19081.201404.xml'), NLS_CHARSET_ID('UTF8')) x_el FROM dual)
     select '081',X.MATRIC,Y.PHTYPE,Y.NATURE,Y.RELIQUAT,Y.MONTANT
    Le INSERT direct sur le WITH DATA AS ne fonctionne pas?
    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. [JDOM] Problème de lecture d'un fichier XML avec Java
    Par thonath dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 27/05/2014, 11h52
  2. Problème d'affichage d'un fichier xml avec un xsl à cause du xmlns
    Par cocoaparis dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 23/03/2011, 14h48
  3. Réponses: 1
    Dernier message: 08/06/2008, 19h05
  4. Problème d'écriture dans un fichier xml
    Par vanoou dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/07/2005, 02h28
  5. Réponses: 2
    Dernier message: 01/06/2004, 12h47

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