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