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