viernes, 1 de agosto de 2025

Error al escribir en un directorio -tipo objeto- de base de datos ORA-29282 ORA-06512: en "SYS.UTL_FILE"

 

Imagina que tienes un bloque de PL/SQL con la siguiente forma:

SET SERVEROUTPUT ON;
DECLARE
vArchivoActuaente UTL_FILE.FILE_TYPE;
vLineaContenidoCliente VARCHAR2(2000);
BEGIN

vArchivoActuaente := UTL_FILE.FOPEN('LOAD_DATA', 'CargaACTUAENTE.txt', 'W');
DBMS_OUTPUT.PUT_LINE('----------INICIO----------');
FOR DATOSCLIENTE IN (consulta a la tabla del esquema en la base de datos)
LOOP
vLineaContenidoCliente := RPAD(DATOSCLIENTE.CEDULA,19,' ') || RPAD(' ',293,' ') || RPAD(DATOSCLIENTE.TELEFONO,15,' ') || RPAD(DATOSCLIENTE.EMAIL,45,' ') || RPAD(' ',1410,' ');
DBMS_OUTPUT.PUT_LINE(vLineaContenidoCliente);
DBMS_OUTPUT.PUT_LINE(LENGTH(vLineaContenidoCliente));
UTL_FILE.PUT_LINE(vArchivoActuaente, vLineaContenidoCliente);
END LOOP;

DBMS_OUTPUT.PUT_LINE('-----------FIN------------');

UTL_FILE.FCLOSE(vArchivoActuaente);

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR: ' || SQLERRM);
IF UTL_FILE.IS_OPEN(vArchivoActuaente) THEN
UTL_FILE.FCLOSE(vArchivoActuaente);
END IF;
RAISE;
END;
/

Pero al ejecutar el bloque recibes el siguiente mensaje.

Informe de error -
ORA-29282: identificador de archivo no válido
ORA-06512: en línea 37
ORA-06512: en "SYS.UTL_FILE", línea 878
ORA-06512: en línea 24
ORA-06512: en línea 24
29282. 00000 - "invalid file ID"
*Cause: A file ID handle was specified for which no corresponding
open file exists.
*Action: Verify that the file ID handle is a value returned from a
call to UTL_FILE.FOPEN.

En donde esta el problema.?
Si el tema no es de permisos para el esquema que ejecuta el procedimiento sobre el directorio de la base de datos o sobre los permisos a nivel de sistema operativo sobre la carpeta, la solución es realmente simple.

En la apertura del archivo hace falta aumentar el tamaño de buffer de la línea - max_linesize-. En este caso de Oracle Database 12c en adelante 32767 bytes.

Cambia entonces la línea como sigue para resolver el tema: 
  • vArchivoActuaente := UTL_FILE.FOPEN('LOAD_DATA', 'CargaACTUAENTE.txt', 'W', 32767); 


No hay comentarios:

Publicar un comentario

Te agradezco tus comentarios. Te esperamos de vuelta.

Todos los Sábados a las 8:00PM