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