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 :

[Ora 10g]Utl_file.fopen et erreur ORA-29283


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 11
    Points : 7
    Points
    7
    Par défaut [Ora 10g]Utl_file.fopen et erreur ORA-29283
    Bonjour, j'utilise oracle 10 g expresse, installé sur un serveur Linux, à distance et j'ai crée un pakage PL/SQL (heu je suis loin d'être un spécialiste Oracle) pour lire des données dans des fichiers, situés dans un répertoir, sur le même serveur linux où est installé ma base Oracle.

    J'ai créer un répertoir oracle 'FICHIERS_IN' et mis des droits en lecture et écriture dessus, pour tout le monde, avec les instructions suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE DIRECTORY FICHIERS_IN AS '/home/share/aida/www;
    GRANT READ, WRITE ON DIRECTORY fichiers_in TO PUBLIC;
    j'ai une fonction pricipale 'initialisation_codif' qui appelle 2 fonctions secondaires:
    I) Une fonction qui ouvre et lit le contenu d'un fichier QH00.txt de paramètre qui contient:
    1)une première ligne avec le nom d'un fichier de données qui s'appel QH00
    2)Plusieurs lignes comportant chacune un chiffre (des paramètres qui me permettront de découper chacune des lignes de mon fichier de données, mais ce n'est pas le propos ici...)

    II) une fonction qui se sert du précédent nom de fichier récuppéré par la fonction I) pour ouvrir un fichier de données et faire divers traitements dessus.

    A noté que mes deux fichiers QH00.txt et QH00 sont dans le même répertoire :
    '/home/share/aida/www


    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
    74
    75
    76
    77
    78
    79
    80
     
     
    --FONCTION PRINCIPALE
    PROCEDURE initialisation_codif
    IS
    nomFic VARCHAR2(200);
    t_rang TYP_TAB_NUM;
    t_val TYP_TAB_VAR;
    BEGIN
    --ouverture et lecture de QH00.txt
    chargement_fichier_param('QH00.txt', nomFic,t_rang);
    dbms_output.put_line('initialisation_codif:' || nomFic || ':');
     
    --ouvertur et lecture de QH00
    lit_fic (nomFic, t_rang, t_val );
     
    END initialisation_codif; 
     
    --FONCTION I
    PROCEDURE chargement_fichier_param(nom_fic_param IN VARCHAR2, nom_fic  OUT NOCOPY VARCHAR2, t_rang OUT NOCOPY TYP_TAB_NUM) 
    IS
    v_ligne VARCHAR2(200);
    p_fic utl_file.file_type;
    n_count NUMBER :=1;
     
    BEGIN
    p_fic := utl_file.fopen(nom_rep_param, nom_fic_param, 'r');
    utl_file.get_line(p_fic,v_ligne);
    nom_fic := v_ligne;
    dbms_output.put_line('Chargement_fichier_param :' || nom_fic);
    LOOP
      BEGIN 
       utl_file.get_line(p_fic,v_ligne);
       dbms_output.put_line('Chargement_fichier_param :' || v_ligne);
       IF (v_ligne <> NULL) THEN
         t_rang(n_count):= v_ligne;
       END IF;
       n_count := n_count + 1;
     
       EXCEPTION
       WHEN NO_DATA_FOUND THEN
          utl_file.fclose(p_fic);
       EXIT;
      END; 
    END LOOP;
     
    END chargement_fichier_param;
     
     
    --FONCTION II
    PROCEDURE lit_fic ( nom_fic IN VARCHAR2, t_rang IN  TYP_TAB_NUM, t_val  OUT  TYP_TAB_VAR)
    IS         
    v_ligne VARCHAR2(200);
    p_fic utl_file.file_type;
    n_count NUMBER;
    BEGIN
    --à l'affichage on a bien nom_fic qui est égale à QH00
    dbms_output.put_line('lit_fic: '|| nom_fic);
    --ouverture du fchier, c'est à ce moment qu'est générée l'erreur :ORA-29283: opération non valide sur le fichier
    p_fic := utl_file.fopen(nom_rep_in, nom_fic, 'r');
    LOOP
      BEGIN 
      utl_file.get_line(p_fic,v_ligne);
      dbms_output.put_line(v_ligne);
      t_val(1):= SUBSTR (v_ligne,1 ,t_rang(1));
      dbms_output.put_line(t_val(1)); 
      n_count :=1;
      FOR  i in 2..t_rang.COUNT LOOP
          n_count := n_count + t_rang(i-1);
          t_val(i):= SUBSTR (v_ligne,n_count,t_rang(i));
          dbms_output.put_line(t_val(i)); 
      END LOOP ;
     
      EXCEPTION
      WHEN NO_DATA_FOUND THEN
         utl_file.fclose(p_fic);
         EXIT;
      END; 
    END LOOP;
    END lit_fic;
    L'ouverture et la lecture du premier fichier 'QH00.txt' se passe sans problème et on récupère bien le nom du deuxième fichier nom_fic =QH00. Lorsque l'on fait afficher le nom du fichier nom_fic, entre l'appel de la première et de la deuxième fonction, on a bien QH00.

    pourtant lors de l'ouverture du fichier QH00 dans la deuxième fonction, oracle nous renvois l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    ORA-29283: opération non valide sur le fichier
    ORA-06512: à "SYS.UTL_FILE", ligne 475
    ORA-29283: opération non valide sur le fichier
    ORA-06512: à "AIDA_REPRISE.LOAD_FILE", ligne 17
    ORA-06512: à "AIDA_REPRISE.LOAD_FILE", ligne 111
    ORA-06512: à ligne 2
    En revanche, si, au lieu de passer le paramètre nom_fic, à la fonction 'lit_fic',( paramètre récupéré à la fonction chargement_fichier_param) , on lui passe directement le paramètre 'QH00', on n'a pas d'erreur à l'ouverture du fichier QH00...
    Ce qui me fait dire qu'il ne s'agit sans doute pas d'un problème de droit...
    Je ne sais pas quoi faire et je tourne en rond depuis 2 jour.
    Si quelqu'un a une idée, je suis preneuse....
    Merci de votre aide!

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    ORA-29283: invalid file operation
    Cause: An attempt was made to read from a file or directory that does not exist, or file or directory access was denied by the operating system.
    Action: Verify file and directory access privileges on the file system, and if reading, verify that the file exists
    Es-tu sûre que ton fichier existe ? que la casse est respectée ? qu'il n'y a pas d'espace à la fin ?

  3. #3
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    tu n'as pas un pb avec l'extension d'un coté tu ouvres 'QH00.txt' et d'un autre tu dis que le nom de fichier est 'QH00' ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    non j'ai bien 2 fichier différents:
    un fichier 'QH00.txt' qui contient entre autre, le nom de mon deuxième fichier (qui lui n'a pas d'extensions':
    Deuxième fichier 'QH00'
    Deuxièmement, j'ai bien respecté la cast, (tout en majuscule)et je n'ai pas fait d'erreur en des OO et des 00,
    En outre le fichier s'ouvre bien si je copie et colle directement le nom du fichier QH00, à la place de mon paramètre 'nom_fic' (qui lui même est égale à QH00 j'y comprends plus rien!!!

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    ah oui, et pour les espaces, j'ai bien vérifier également en faisant afficher 'nom_fic' entre deux autres caractères...y'a pas d'espace...
    j'sais vraiment plus quoi tenter, c'est un truc de fou...

  6. #6
    Membre averti

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Points : 398
    Points
    398
    Par défaut
    si il fonctionne en mettant le nom en dur il faut jouer avec le NOCOPY car c'est bien si tu es dans un package (utilisation des passages de paramètre par valeur/référence)

    on sait jamais regarde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    NOCOPY
    Specify NOCOPY to instruct Oracle to pass this argument as fast as possible. This clause can significantly enhance performance when passing a large value like a record, an index-by table, or a varray to an OUT or IN OUT parameter. (IN parameter values are always passed NOCOPY.)
     
    When you specify NOCOPY, assignments made to a package variable may show immediately in this parameter (or assignments made to this parameter may show immediately in a package variable) if the package variable is passed as the actual assignment corresponding to this parameter. 
    Similarly, changes made either to this parameter or to another parameter may be visible immediately through both names if the same variable is passed to both. 
    If the procedure is exited with an unhandled exception, any assignment made to this parameter may be visible in the caller's variable. 
    These effects may or may not occur on any particular call. You should use NOCOPY only when these effects would not matter.

    Sinon tu as a quoi comme caractère de retour chariot ? chr(10) ou chr(10) + chr(13)

    Le fichier contenant les noms de fichier a traité a été créé sous windows et transféré via FTP ou a t il été créé directement sous unix ?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    merci pour ton idée des NOCOPY, malheureusement j'ai déjà essayé et celà n'a rien donnée.
    En revanche je ne connais pas le caractère de retour chariot du fichier d'ailleurs comment puis je le savoir?), mais ce qui est sur c'est que le fichier de paramètres QH00.txt a été crée sous Windows, et non pas sous linux (je développe sur mon post dont l'OS est windows).
    Le problème vient peut être de là.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    j'ai trouvé mon problème: effectivement Sygal, c'est bien du au au retours charriot. Lors du transfert de mes fichiers de windows à Linux, les retours charriot (chr(13) semblent être ajouté en fin de chaque ligne).
    J'ai plusieurs solutions pour contourner le pb:
    1) utiliser ultra edit (heu j'espère que je ne fait pas de pub là, sinon je m'en excuse) pour convertir els ficheir de DOC à vers UNIX
    2) ou créer mon fhicier de paramètre en PL/SQL grâce au package UTL_FILE, (comme ca je suis assurée du bon format de mes fichiers
    3) ou alors faire pour chaque ligne un :REPLACE(ligne_texte, CHR(13),NULL)

    Voilà merci de votre aide.

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

Discussions similaires

  1. [Oracle 10g] Erreur ORA-04062
    Par ToxiZz dans le forum Oracle
    Réponses: 8
    Dernier message: 13/11/2009, 10h31
  2. [10g] erreur ORA-01652 suite à INSERT-SELECT
    Par TG37140 dans le forum Administration
    Réponses: 5
    Dernier message: 18/12/2006, 19h45
  3. [Oracle 10g] Erreur ORA-00600
    Par Pakkaï dans le forum Oracle
    Réponses: 6
    Dernier message: 21/09/2006, 15h01
  4. [Oracle 10g] Comment résoudre une erreur ORA-3000
    Par DoRiane dans le forum Oracle
    Réponses: 3
    Dernier message: 10/04/2006, 09h44
  5. Réponses: 1
    Dernier message: 02/02/2006, 23h12

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