Ver Mensaje Individual
  #4 (permalink)  
Antiguo 07/12/2011, 21:28
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: Listar contenido de un directorio

No hay una función propia de Oracle para leer los archivos de un directorio, lo tendrás que resolver desarrollando algún proceso, en principio se me ocurren 3 opciones:

1. Utilizar un lenguaje fuera de la base de datos (java, c#, etc.) que lea los ficheros, inserte la lista en una tabla temporal dentro de la base y ejecute tu procedimiento..

2. Desde el sistema operativo, crear un script (listar.bat) que guarde la lista de ficheros en un .txt, ejecute el SQL*Loader para subir el contenido del .txt a una tabla dentro de la base y ejecute tu procedimiento con el SQL*Plus . Esto implica ejecutar el proceso desde Windows, en forma manual o con las Tareas Programadas.

Código:
REM contenido de listar.bat
cd directorio
dir /b > ficheros.txt
sqlldr usuario/pass@base control=fichero.ctl data=ficheros.txt
REM el fichero proceso.sql ejecuta tu procedimiento
sqlplus usuario/pass@base @proceso.sql
3. Si quieres que la ejecución del proceso sea dentro de la base de datos, puedes crear, en el sistema operativo un script (listar.bat) que lea los ficheros y guarde la lista en ficheros.txt, y crear en la base de datos, con el paquete dbms_scheduler, un job para ejecutar el script listar.bat, y un procedimiento que lea el contenido de ficheros.txt y ejecute tu procedimiento.

Código:
REM contenido de listar.bat
dir /b > ficheros.txt
Código:
--crear el job para ejecutar el .bat
begin
 dbms_scheduler.create_program (
  program_name            => 'LISTAR_BAT',
  program_type            => 'EXECUTABLE',
  program_action  => 'c:\directorio\listar.bat',
  enabled                 => TRUE);
end;
/

begin
 dbms_scheduler.create_job (
   job_name          =>  'LISTAR_JOB',
   program_name      =>  'LISTAR_BAT',
   enabled            =>  TRUE);
END;
/
Código:
--proceso dentro de la base
begin
 dbms_scheduler.run_job ('LISTAR_JOB');
  --leer ficheros.txt con UTL_FILE y hacer un loop por cada línea 
  loop
     tu_procedimiento();
  end loop;
end;
Saludos