Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So beheben Sie ORA-29285:Dateischreibfehler

ORA-29285:Dateischreibfehler ist einer der Fehler, die bei der Dateiverarbeitung in der Oracle-Datenbank auftreten können

Dateibearbeitungsvorgänge erstellen eine neue Datei auf dem Betriebssystem, aktualisieren oder ändern sie. Diese Funktion wird in PLSQL häufig zur Dateimanipulation verwendet

Gründe und Beschlüsse für ORA-29285

(1) Das Unix-/Linux-Dateisystem, in das Sie die Datei schreiben, ist voll, dh es ist zu 100 % ausgelastet.

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

Auflösung

Geben Sie den Speicherplatz in /u500  frei und wir können den PLSQL-Block erneut prüfen

Im Grunde müssen Sie also die unnötigen Dateien im verwendeten Dateisystem löschen. Bitte stellen Sie sicher, dass Sie keine Dateien löschen, die derzeit verwendet werden. Wenn Sie aktive Dateien löschen, wird kein Speicherplatz freigegeben

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) Wenn eine Datei von FOPEN geöffnet wird, es sei denn, es wurde ein Wert für den Parameter MAX_LINESIZE angegeben, wird standardmäßig 1024 verwendet. Dieser Fehler tritt also auch auf, wenn Sie mehr als 1024 Zeichen in die Zeile einfügen

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

Auflösung

Wir können diesen Fehler verhindern, indem wir die maximale Zeilengröße angeben

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.

Der Parameter MAX_LINESIZE kann bis zu 32767 betragen. Wenn Sie Zeilen haben, die länger als 32 KB sind, sollten die Daten binär geschrieben werden.

(3)  Dieser Fehler kann auftreten, wenn UTL_FILE.PUT_LINE wiederholt in einer Schleife aufgerufen wird, wenn kumulativ mehr als 1024  Zeichen geschrieben werden. Der Grund ist eine falsche Einstellung von ORA_NLS10 oder die Variable ORA_NLS10 ist nicht gesetzt

Beispiel

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

Auflösung

Bitte stellen Sie sicher, dass ORA_NLS10 in der Oracle-Datenbank und Listener-Umgebung eingestellt ist

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.

Ich hoffe, Ihnen gefällt dieser ausführliche Beitrag zu ORA-29285. Bitte liken Sie es und geben Sie Feedback

Verwandte Artikel
ORA-29280:Ungültiger Verzeichnispfad
ORA-29283:Ungültiger Dateivorgang
ORA-00942 Tabelle oder Ansicht existiert nicht
ORA-29913
FND_FILE in Oracle-Apps
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e29250.htm