Oracle
 sql >> Database >  >> RDS >> Oracle

Come risolvere ORA-29285:errore di scrittura del file

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