ORA-29285 :l'erreur d'écriture de fichier est l'une des erreurs qui peuvent survenir lors de l'opération de gestion de fichiers dans la base de données Oracle
Les opérations de gestion de fichiers créent un nouveau fichier sur le système d'exploitation, le mettent à jour ou le modifient. Cette fonction est assez souvent utilisée en PLSQL pour la manipulation de fichiers
Raison et résolutions pour ORA-29285
(1) Le système de fichiers Unix/Linux dans lequel vous écrivez le fichier est plein, c'est-à-dire qu'il est utilisé à 100 %.
df -h /u500 /u500 100 0 declare fileHandler UTL_FILE.FILE_TYPE; begin fileHandler := UTL_FILE.FOPEN('/u500', 'tech', 'W'); UTL_FILE.PUT_LINE(fileHandler, 'This is the file for test'); UTL_FILE.FCLOSE(fileHandler); end; / DECLARE * ERROR at line 1: ORA-29285: file write error ORA-06512: at "SYS.UTL_FILE", line 4 ORA-06512: at "SYS.UTL_FILE", line 1169 ORA-06512: at line 6
Résolution
Libérez de l'espace dans /u500 et nous pouvons vérifier à nouveau le bloc PLSQL
Donc, fondamentalement, vous devez effacer les fichiers inutiles dans le système de fichiers utilisé. Assurez-vous de ne supprimer aucun fichier en cours d'utilisation. Si vous supprimez des fichiers actifs, l'espace ne sera pas libéré
df -h /u500 /u500 80 20 declare fileHandler UTL_FILE.FILE_TYPE; begin fileHandler := UTL_FILE.FOPEN('/u500', 'tech', 'W'); UTL_FILE.PUT_LINE(fileHandler, 'This is the file for test'); UTL_FILE.FCLOSE(fileHandler); end; / 2 3 4 5 6 PL/SQL procedure successfully completed.
(2) Lorsqu'un fichier est ouvert par FOPEN à moins qu'une valeur ne soit spécifiée pour le paramètre MAX_LINESIZE, il sera par défaut à 1024. Cette erreur se produit donc également si vous mettez plus de 1024 caractères dans la ligne
DECLARE file_name VARCHAR2(256) := 'test.lst'; file_text VARCHAR2(100) := '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890....<2000 character>'; file_id UTL_FILE.file_type; BEGIN file_id := UTL_FILE.fopen('/tmp', file_name, 'W'); UTL_FILE.put_line(file_id, file_text); UTL_FILE.fclose(file_id); END; / DECLARE * ERROR at line 1: ORA-29285: file write error ORA-06512: at "SYS.UTL_FILE", line 2 ORA-06512: at "SYS.UTL_FILE", line 1169 ORA-06512: at line 6
Résolution
Nous pouvons éviter cette erreur en spécifiant la taille de ligne maximale
DECLARE file_name VARCHAR2(256) := 'test.lst'; file_text VARCHAR2(100) := '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890....<2000 character>'; file_id UTL_FILE.file_type; BEGIN file_id := UTL_FILE.fopen('/tmp', file_name, 'W',5000); UTL_FILE.put_line(file_id, file_text); UTL_FILE.fclose(file_id); END; / 2 3 4 5 6 PL/SQL procedure successfully completed.
Le paramètre MAX_LINESIZE peut aller jusqu'à 32767. Si vous avez des lignes de plus de 32 Ko, les données doivent être écrites en binaire.
(3) Cette erreur peut se produire lors de l'appel répété de UTL_FILE.PUT_LINE dans une boucle lors de l'écriture cumulée de plus de 1 024 caractères. La raison est une configuration incorrecte de ORA_NLS10 ou la variable ORA_NLS10 n'est pas définie
Exemple
unset ORA_NLS10 sqlplus / as sysdba shutdown immediate startup sqlplus "/ as sysdba" DECLARE file_name VARCHAR2(256) := 'test.lst'; file_text VARCHAR2(100) := '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'; file_id UTL_FILE.file_type; BEGIN file_id := UTL_FILE.fopen('/tmp', file_name, 'W'); FOR x IN 1..11 LOOP -- write 11 records UTL_FILE.put_line(file_id, file_text); END LOOP; UTL_FILE.fclose(file_id); END; / ORA-29285: file write error
Résolution
Assurez-vous que ORA_NLS10 est défini dans la base de données Oracle et l'environnement d'écoute
ORACLE_SID=TEST ORA_NLS10=< > sqlplus / as sysdba shutdown immediate startup lsnrctl stop TEST lsnrctl start TEST sqlplus / as sysdba DECLARE file_name VARCHAR2(256) := 'test.lst'; file_text VARCHAR2(100) := '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'; file_id UTL_FILE.file_type; BEGIN file_id := UTL_FILE.fopen('/tmp', file_name, 'W'); FOR x IN 1..11 LOOP -- write 11 records UTL_FILE.put_line(file_id, file_text); END LOOP; UTL_FILE.fclose(file_id); END; / PL/SQL procedure successfully completed.
J'espère que vous aimez cet article détaillé sur ORA-29285. Merci d'aimer et de donner votre avis
Articles connexes
ORA-29280 :chemin de répertoire non valide
ORA-29283 :opération de fichier non valide
ORA-00942 la table ou la vue n'existe pas
ORA-29913
FND_FILE dans les applications Oracle
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e29250.htm