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.