sql >> Base de Datos >  >> RDS >> Oracle

Cómo resolver ORA-29285:error de escritura de archivo

ORA-29285:el error de escritura de archivo es uno de los errores que se pueden producir al realizar una operación de manejo de archivos en la base de datos de Oracle

Las operaciones de manejo de archivos están creando un nuevo archivo en el sistema operativo, actualizándolo o modificándolo. Esta función se usa con bastante frecuencia en PLSQL para la manipulación de archivos

Motivo y Resoluciones de ORA-29285

(1) El sistema de archivos Unix/Linux donde está escribiendo el archivo está lleno, es decir, se utiliza 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

Resolución

Libere el espacio en /u500  y podemos verificar nuevamente el bloque PLSQL

Básicamente, debe borrar los archivos innecesarios en el sistema de archivos que se está utilizando. Asegúrese de no eliminar ningún archivo que esté actualmente en uso. Si elimina algún archivo activo, no se liberará espacio

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) Cuando FOPEN abre un archivo a menos que se especifique un valor para el parámetro MAX_LINESIZE, el valor predeterminado será 1024. Por lo tanto, este error también ocurre si está poniendo más de 1024 caracteres en la línea

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

Resolución

Podemos evitar este error especificando el tamaño de línea máximo

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.

El parámetro MAX_LINESIZE puede ser de hasta 32767. Si tiene líneas de más de 32 K, los datos deben escribirse como binarios.

(3) Este error puede ocurrir al llamar a UTL_FILE.PUT_LINE repetidamente en un bucle cuando se escribe acumulativamente más de 1024 caracteres. El motivo es una configuración incorrecta de ORA_NLS10 o la variable ORA_NLS10 no está configurada

Ejemplo

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

Resolución

Asegúrese de que ORA_NLS10 esté configurado en la base de datos de Oracle y en el entorno de escucha

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.

Espero que les guste este post detallado sobre ORA-29285. Por favor, haz clic en Me gusta y envíanos tus comentarios

Artículos relacionados
ORA-29280:ruta de directorio no válida
ORA-29283:operación de archivo no válida
ORA-00942 la tabla o vista no existe
ORA-29913
FND_FILE en las aplicaciones de Oracle
https://docs.oracle.com/cd/E11882_01/server.112/e17766/e29250.htm