ORA-29285:l'errore di scrittura del file è uno degli errori che possono verificarsi durante l'esecuzione dell'operazione di gestione dei file nel database di Oracle
Le operazioni di gestione dei file sono la creazione di un nuovo file sul sistema operativo, l'aggiornamento o la modifica. Questa funzione è usata abbastanza spesso in PLSQL per la manipolazione dei file
Motivo e risoluzioni per ORA-29285
(1) Il file system Unix /Linux in cui stai scrivendo il file è pieno, ovvero è utilizzato al 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
Risoluzione
Libera lo spazio in /u500 e possiamo ricontrollare il blocco PLSQL
Quindi fondamentalmente è necessario cancellare i file non necessari nel file system utilizzato. Assicurati di non eliminare i file attualmente in uso. Se elimini i file attivi, lo spazio non verrà rilasciato
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) Quando un file viene aperto da FOPEN a meno che non venga specificato un valore per il parametro MAX_LINESIZE, il valore predefinito sarà 1024. Quindi questo errore si verifica anche se si inseriscono più di 1024 caratteri nella riga
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
Risoluzione
Possiamo prevenire questo errore specificando la dimensione massima della linea
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.
Il parametro MAX_LINESIZE può arrivare fino a 32767. Se hai righe più lunghe di 32K, i dati dovrebbero essere scritti come binari.
(3) Questo errore può verificarsi durante Richiamare UTL_FILE.PUT_LINE ripetutamente in un ciclo quando si scrivono cumulativamente più di 1024 caratteri. Il motivo è l'impostazione errata di ORA_NLS10 o la variabile ORA_NLS10 non è impostata
Esempio
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
Risoluzione
Assicurati che ORA_NLS10 sia impostato nel database Oracle e nell'ambiente listener
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.
Spero che questo post dettagliato su ORA-29285 vi piaccia. Per favore, metti mi piace e fornisci feedback
Articoli correlati
ORA-29280:percorso directory non valido
ORA-29283:operazione file non valida
La tabella o la vista ORA-00942 non esiste
ORA-29913
FND_FILE nelle app Oracle
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e29250.htm