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

Oracle Discussion :

PB AVEC UTL_FILE.PUT (ERREUR UTL_FILE.WRITE_ERROR)


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 51
    Points : 35
    Points
    35
    Par défaut PB AVEC UTL_FILE.PUT (ERREUR UTL_FILE.WRITE_ERROR)
    Bonjour à tous,

    Je dois impérativement créer un fichier contenant des enregistrements les uns à la suite des autres sans caractère de fin de ligne

    Voici la procédure que je teste :

    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
     
    SET LINESIZE 3000
    SET SERVEROUTPUT ON
     
     
    var dat_deb           VARCHAR2(20)
    var dat_fin           VARCHAR2(20)
     
    BEGIN
      DECLARE
     
        w_repertoire      prtami.val_pmt %TYPE:='/home/mle/';     
        w_nom_fic         VARCHAR2(100) := 'tmp_' || LOWER(USER) || '_test.log'; 
        w_fic_cre         UTL_FILE.FILE_TYPE;
        w_texte           VARCHAR2(32000) := 'XYZ';
     
      BEGIN
        :dat_deb  := TO_CHAR(SYSDATE,'dd/mm/yyyy-HH24.MI.SS');
     
        w_fic_cre  := UTL_FILE.FOPEN (w_repertoire,w_nom_fic,'w');
     
     
        UTL_FILE.PUT (w_fic_cre ,'Début : ' || :dat_deb);
     
        UTL_FILE.PUT (w_fic_cre ,'-XXXXXXXXXXXXXXXXXXX-');
     
        UTL_FILE.PUT (w_fic_cre ,'YYYYYYYYYYYYYYYYYYYYYY-');
     
        UTL_FILE.PUT (w_fic_cre ,'ZZZZZZZZZZZZZZZZZZZZZZ-');
     
     
        UTL_FILE.PUT (w_fic_cre ,RPAD(w_texte,3000,'V'));
     
        UTL_FILE.PUT (w_fic_cre ,RPAD(w_texte,3000,'D'));
     
        :dat_fin := TO_CHAR(SYSDATE,'dd/mm/yyyy-HH24.MI.SS');  
     
        UTL_FILE.PUT (w_fic_cre ,'Fin : ' || :dat_fin);
     
        UTL_FILE.FCLOSE(w_fic_cre); 
     
       EXCEPTION
     
       -- exceptions levées par les procédures d'IO de UTL_FILE 
     
        WHEN UTL_FILE.INVALID_PATH THEN
          dbms_output.put_line('erreur path');
     
        WHEN UTL_FILE.INVALID_MODE THEN
          dbms_output.put_line('erreur mode');
     
        WHEN UTL_FILE.INVALID_FILEHANDLE THEN
          dbms_output.put_line('erreur mode');
     
        WHEN UTL_FILE.INVALID_OPERATION THEN
          dbms_output.put_line('erreur op');
     
        WHEN UTL_FILE.READ_ERROR THEN
          dbms_output.put_line('erreur read');
     
        WHEN UTL_FILE.WRITE_ERROR THEN
          dbms_output.put_line('erreur write');
     
        WHEN UTL_FILE.INTERNAL_ERROR THEN
          dbms_output.put_line('erreur internal');
     
      END; 
    END;
    /
    Mais lorque je l'exécute l'exception WHEN UTL_FILE.WRITE_ERROR THEN se déclenche => affichage de 'erreur write'

    Que dois-je faire pour pouvoir résoudre ce problème ?

    Merci d'avance pour vos réponses.

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    tu as bien le droit d'écrire dans le répertoire ?

    le fichier n'est pas trop gros, tu as de l'espace disque ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Bonjour orafrance,

    Concernant tes questions, Oui j'ai le droit d'écrire et j'ai assez de place (704Mo).

    Si je met en commentaire les lignes suivantes


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        --UTL_FILE.PUT (w_fic_cre ,RPAD(w_texte,3000,'V'));
     
        --UTL_FILE.PUT (w_fic_cre ,RPAD(w_texte,3000,'D'));
    ça marche très bien.

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    il suffit de lire la doc : http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96612/u_file2.htm#998477

    The maximum size of the buffer parameter is 32767 bytes unless you specify a smaller size in FOPEN. The default is approximately 1000 bytes, depending on your platform.

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    remplace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    w_fic_cre  := UTL_FILE.FOPEN (w_repertoire,w_nom_fic,'w');
    Par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    w_fic_cre  := UTL_FILE.FOPEN (w_repertoire,w_nom_fic,'w',32767);

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Merci, ça marche pour mon exemple en rajoutant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    w_fic_cre  := UTL_FILE.FOPEN (w_repertoire,w_nom_fic,'w',32767);
    Mais comme j'ai :

    - une entête qui fait 128 caractères
    - n contenu(s) clients qui fait (font) chacun 256 caractères
    - une fin de fichier qui fait 128 caractères

    ça risque de planter à un moment ou à un autre et je me retrouve au même point qu'avant.

    Y aurait-il un autre moyen ?

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    peut-être en passant par un CLOB et UTL_FILE.PUT_LINE avec le CLOB en paramétre... à vérifier

  8. #8
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Vu que tu es déjà en PL/SQL, tu peux concaténer tes valeurs en PL/SQL et construire des tranches de 30000 (max) et écrire ces tranches là une par une. Comme ça tu es sûr de pas dépasser la limite.
    Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    mais bien sûr... pourquoi ne pas refermer le fichier et l'ouvrir en mode append

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Merci pour vos solutions, mais le fait d'ouvrir et de refermer le fichier ne va pas résoudre mon problème.

    En effet, lors de la fermeture du fichier, ORACLE met un 0A (hexa) à la fin de fichier ce qui équivaut à un caractère de fin de ligne.

    Est ce qu'il existerait sous ORACLE 9i un autre PACKAGE pour la création de fichier ?

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 51
    Points : 35
    Points
    35
    Par défaut
    Pour info, j'avais ouvert un TAR sur METALINK

    Voici la réponse d'ORACLE

    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
     
    22-JUL-05 09:32:55 GMT
     
    Bonjour,
     
    UTL_FILE n'a pas été crée pour cet usage. Selon la documentation PL/SQL, chapitre 9:
     
    "A propos du package UTL_FILE
     
    Le package UTL_FILE permet aux programmes PL/SQL le lire et écrire des fichiers textes du systeme d'exploitation. Il
    offre une version limitée du standard d'entrée sortie du system d'exploitation,
    y compris les opérations open, out, get et close."
     
    Merci de voir également les commentaires sur le paramatetre max_linesize de fopen() dans utlfile.sql. 
    Le caractère x'0A' à la fin est placé volontairement, parce que les lignes de fichiers texte doivent 
    se terminer par un caractère de fin de ligne.
     
    ===================================
     
    22-JUL-05 09:45:04 GMT
     
    New info :  Bonjour,
    .
    Merci pour votre Réponse.
    .
    Quelle autre "solution" me proposez-vous pour que je puisse créer ce fichier ?
    Existe-il un package oracle qui permette de régler ma demande ?
    .
    Salutations
     
    =======================================
     
    22-JUL-05 14:43:39 GMT
     
    Bonjour,
     
    Il semblerait qu'en fait, UTL_FILE puisse être utilisé pour écrire des fichiers binaires. 
    La documentation semble etre en retrait par rapport au code du package lui-même.
     
    Toutefois, cette fonctionalité ne marche pas en 9.2 à cause du bug 2546782 qui est fixé en 10.1.0.1. 
    Malheureusement, le correctif ne peut pas être appliqué en 9.2, donc la seule solution serait de 
    passer en 10g. Si vous ne pouvez pas passer en 10g, il faudra trouver un autre moyen pour faire cela.
     
    UTL_FILE est le seul package qui supporte des entrees/sorties de fichier.
     
    *** DWSPENCE.UK 22-JUL-2005 13:36:06 GMT, 22-JUL-05 Local ***
     
    J'ai trouvé la page suivante qui explique comment faire en 10g:
     
    http://www.idevelopment.info/data/Oracle/DBA_tips/LOBs/LOBS_10.shtml
    En résumé, il faut que je trouve une autre solution ou que je passe en 10g

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

Discussions similaires

  1. Message erreur UTL_FILE
    Par haykelFST dans le forum PL/SQL
    Réponses: 2
    Dernier message: 20/11/2012, 17h50
  2. Probleme avec requete, une erreur survient...
    Par charleshbo dans le forum Access
    Réponses: 6
    Dernier message: 09/02/2006, 14h27
  3. Réponses: 11
    Dernier message: 20/01/2006, 12h35
  4. Test sur formulaire avec liste des erreurs
    Par Nicos77 dans le forum Langage
    Réponses: 37
    Dernier message: 17/11/2005, 10h22
  5. Génération de lignes entières avec TEXT_IO.PUT
    Par ludo.guy dans le forum Oracle
    Réponses: 9
    Dernier message: 13/10/2004, 15h28

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