Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment résoudre ORA-29285 :erreur d'écriture de fichier

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