ORA-29283: Invalid File Operation
S'APPLIQUE À : PL/SQL
PL/SQL - Version 9.2.0.6 et suivantes
Les informations de ce document s'appliquent à toutes les plateformes.
***Pertinence vérifiée le 16 mai 2016***
SYMPTÔMES
Bien que cette note illustre une seule erreur, elle en présente plusieurs causes possibles.
Pour exécuter l'exemple, vous devez créer un alias de répertoire
SQL> CREATE DIRECTORY NOTE_TEST AS 'C:/FileStore';
Directory created.
Le bloc anonyme suivant sert à provoquer l'erreur, qui peut survenir de bien des façons : même si votre code diffère de celui-ci, l'erreur générée peut être la même.
SQL> DECLARE
input_file utl_file.file_type;
input_buffer varchar2(10000);
BEGIN
input_file := utl_file.fopen ('NOTE_TEST', 'TestFile.txt', 'r');
utl_file.get_line (input_file,input_buffer);
utl_file.fclose(input_file);
END;
/
DECLARE
*
ERROR at line 1:
ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 475
ORA-29283: invalid file operation
CAUSE : UTL_FILE.FOPEN(), Oracle9i PL/SQL Packages Reference (9.2)
L'erreur peut avoir l'une des quatre causes suivantes :
Problème 1 - Le répertoire référencé est incorrect.
Problème 2 - Les privilèges d'accès au répertoire n'ont pas été accordés à l'utilisateur.
Problème 3 - Tentative de lecture d'un fichier vide.
Problème 4 - Le fichier d'entrée a une longueur de ligne supérieure à 1000 octets, ce qui n'a pas été indiqué dans :
UTL_FILE.FOPEN(). UTL_FILE.FOPEN est mal configuré. Le code fourni ne passe pas de paramètre max_linesize à la méthode UTL_FILE.FOPEN. Si ce paramètre facultatif max_linesize n'est pas indiqué, une valeur par défaut comprise entre 1 et 1000 est utilisée. Le paramètre max_linesize est nécessaire si la longueur des lignes du fichier dépasse 1000, comme l'indique la documentation du package UTL_FILE dans :
Oracle9i Supplied PL/SQL Packages and Types Reference
Release 2 (9.2)
Part Number A96612-01
FOPEN Function
Cette fonction ouvre un fichier. Vous pouvez indiquer la longueur maximale des lignes, et jusqu'à 50 fichiers peuvent être ouverts simultanément. Voir aussi "FOPEN_NCHAR Function".
Syntaxe
UTL_FILE.FOPEN (
location IN VARCHAR2,
filename IN VARCHAR2,
open_mode IN VARCHAR2,
max_linesize IN BINARY_INTEGER)
RETURN file_type;
Paramètres de la fonction FOPEN
Paramètre Description
location - Répertoire où se trouve le fichier
filename - Nom du fichier, extension (type de fichier) comprise, sans le chemin
du répertoire. Sous Unix, le nom de fichier ne peut pas se terminer par /.
open_mode - Indique le mode d'ouverture du fichier. Les modes sont :
r--lecture de texte, w--écriture de texte, a--ajout de texte
Si vous tentez d'ouvrir un fichier qui n'existe pas en indiquant une valeur pour open_mode, le fichier est créé en mode écriture.
max_linesize -
Nombre maximal de caractères par ligne pour ce fichier, caractère de fin de ligne compris (valeur minimale 1, valeur maximale 32767). La valeur par défaut est d'environ 1000 octets.
SOLUTION : package UTL_FILE, ORA-29283
Solution du problème 1 - Assurez-vous que le répertoire référencé existe bien et que les privilèges d'accès sont accordés. Utilisez par ailleurs un alias de répertoire (Directory) plutôt que le paramètre de base de données UTL_FILE_DIR, qui est déprécié.
Solution du problème 2 - Accordez les privilèges READ ou WRITE à l'utilisateur qui accède au DIRECTORY.
Pour la configuration du DIRECTORY et les permissions, consultez les notes suivantes :
Note:206272.1 New Method of Using UTL_FILE in Oracle9i 9.2
Note:292961.1 ORA-29280: Invalid Directory Path With UTL_FILE.FOPEN
Solution du problème 3 - Assurez-vous que le fichier lu existe bien et qu'il contient des données à lire.
Solution du problème 4 - Passez une valeur pour le paramètre max_linesize à la méthode UTL_FILE.FOPEN (). En voici un exemple ; assurez-vous que le fichier myfile.html existe et contient des données.
SQL> DECLARE
input_file utl_file.file_type;
input_buffer varchar2(32767);
BEGIN
input_file := UTL_FILE.FOPEN('NOTE_TEST', 'myfile.html','r',32767);
utl_file.get_line (input_file,input_buffer);
utl_file.fclose(input_file);
END;
/
PL/SQL procedure successfully completed.
Pour une analyse détaillée de ce qui se passe réellement au niveau du système d'exploitation, la note suivante explique comment obtenir une trace.
Note:1313404.1 Finding the Underlying Cause For "ORA-29283: invalid file operation" Error When Using the UTL_FILE Package.