ORA-29285:fout bij het schrijven van bestanden is een van de fouten die kunnen optreden tijdens het verwerken van bestanden in de Oracle-database
Bestandsverwerkingsbewerkingen zijn het maken van een nieuw bestand op het besturingssysteem, het bijwerken of wijzigen ervan. Deze functie wordt vrij vaak gebruikt in PLSQL voor bestandsmanipulatie
Reden en oplossingen voor ORA-29285
(1) Unix /Linux-bestandssysteem waarop u het bestand schrijft, is vol, d.w.z. het wordt 100% gebruikt.
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
Oplossing
Maak ruimte vrij in /u500 en we kunnen het PLSQL-blok opnieuw controleren
Dus eigenlijk moet u de onnodige bestanden wissen in het bestandssysteem dat wordt gebruikt. Zorg ervoor dat u geen bestanden verwijdert die momenteel in gebruik zijn. Als u actieve bestanden verwijdert, wordt er geen ruimte vrijgemaakt
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) Wanneer een bestand wordt geopend door FOPEN, tenzij er een waarde is opgegeven voor de parameter MAX_LINESIZE, wordt deze standaard ingesteld op 1024. Deze fout treedt dus ook op als u meer dan 1024 tekens in de regel plaatst
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
Oplossing
We kunnen deze fout voorkomen door de maximale lijngrootte op te geven
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.
De parameter MAX_LINESIZE kan maximaal 32767 zijn. Als u regels heeft die langer zijn dan 32K, moeten de gegevens als binair worden geschreven.
(3) Deze fout kan optreden wanneer UTL_FILE.PUT_LINE herhaaldelijk in een lus wordt aangeroepen bij het schrijven van cumulatief meer dan 1024 tekens. De reden is onjuist Instelling van ORA_NLS10 of de variabele ORA_NLS10 is niet ingesteld
Voorbeeld
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
Oplossing
Zorg ervoor dat ORA_NLS10 is ingesteld in de Oracle-database en luisteraaromgeving
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.
Ik hoop dat je dit gedetailleerde bericht op ORA-29285 leuk vindt. Vind het leuk en geef feedback
Gerelateerde artikelen
ORA-29280:ongeldig mappad
ORA-29283:ongeldige bestandsbewerking
ORA-00942-tabel of weergave bestaat niet
ORA-29913
FND_FILE in oracle-apps
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e29250.htm