utl_file.file_type

jsm
08 de Abril del 2005
Por favor quien me podria decir si existe una instruccion para obtener una linea de un archivo plano
usando utl_file.file_type...
gracias

Pablo Ponte Miserendino
08 de Abril del 2005
Es muy simple.....usando el mismo package de sistema, tenes varias funciones, primero tenes que abrir el archivo y guardar el puntero que te devuelve la funcion, despues usas ese puntero para traer lineas....

creo que un ejemplo sencillo seria este:

DECLARE
l_FileCursor utl_file.file_type;
l_String Varchar2(100);
BEGIN
utl_file.fopen(v_FileCursor, 'Path Completo','NombredeArchivo.extencion');
utl_file.get_line(v_FileCursor,l_String);
utl_file.fclose(v_FileCursor);
-- o bien utl_file.close_all
end;

No estoy seguro de la Sintaxis...hace mucho que no lo uso...
pero es muy sencillo...para obtener mas de una linea haces un bucle con salida en una exception propia del package que salta cuando se acaba el archivo..

Espero que te sirva, cualquier cosa volve a preguntar...

GOOFY
08 de Abril del 2005
Aqui tienes un ejemplo de como sería la sintaxis correcta, incluyendo un bucle que inserte líneas en un fichero:

Es un procedimiento que crea un fichero en un directorio del servidor.
Antes se necesita cambiar un parametro en el fichero init.ora:
UTL_FILE= directorio de escritura>, lo mejor es poner *, asi activa todos los directorios del servidor.


CREATE OR REPLACE PROCEDURE Escritura(

p_Directorio IN VARCHAR2,
p_Fichero IN VARCHAR2) AS


v_ManejadorFichero UTL_FILE.FILE_TYPE;

CURSOR Empleados IS
SELECT * from EMP;


BEGIN
-- Abrir archivo
v_ManejadorFichero := UTL_FILE.FOPEN(P_Directorio, p_Fichero, 'w')

FOR I IN Empleados LOOP
UTL_FILE.PUT_LINE(V_ManejadorFichero, I.CODEMP||I.NAME||I.DIR);
END LOOP;

UTL_FILE.FCLOSE(V_ManejadorFichero);

EXCEPTION
WHEN UTL_FILE.INVALID_OPERATION THEN
UTL_FILE.FCLOSE(V_ManejadorFichero);
RAISE_APPLICATION_ERROR(-20061,'Operacion invalida');

WHEN UTL_FILE.INVALID_FILEHANDLE THEN
UTL_FILE.FCLOSE(V_ManejadorFichero);
RAISE_APPLICATION_ERROR(-20062,'Manejador invalido');

WHEN UTL_FILE.WRITE_ERROR THEN
UTL_FILE.FCLOSE(V_ManejadorFichero);
RAISE_APPLICATION_ERROR(-20063,'Error de escritura');

WHEN UTL_FILE.INVALID_MODE THEN
UTL_FILE.FCLOSE(V_ManejadorFichero);
RAISE_APPLICATION_ERROR(-20064,'Modo invalido');

WHEN UTL_FILE.INTERNAL_ERROR THEN
UTL_FILE.FCLOSE(V_ManejadorFichero);
RAISE_APPLICATION_ERROR(-20065,'Internal Error');
END;

si lo que quieres es leer líneas, abres el fichero para lectura:

v_ManejadorFichero := UTL_FILE.FOPEN(P_Directorio, p_Fichero, 'r')

y en lugar de insertar líneas, las lees con :

UTL_FILE.GET_LINE(V_ManejadorFichero,v_linea);

donde v_linea sería una variable donde cargas la línea completa, si lo que quieres es recuperar solo un trozo de esa línea (por ejemplo los 15 primeros caracteres):
--definimos la variable (en su sitio)
resultado varchar2(15);

--Recuperamos 15 caracteres a partir del primero
resultado := substr(v_linea,1,15);


Espero haber sido de ayuda, si no queda claro no dudes en seguir preguntando, que nadie nace sabiendo... un saludo.