Es muy usual encontrar usuarios encargados de procesos funcionales, los cuales requieren periódicamente realizar cargues de información a las bases de datos de una organización. Para ello existen muchas alternativas, desde enviarle directamente el archivo al administrador de la base de datos para que él realice el cargue, hasta el desarrollo de un portal simple que le permita al usuario realizar dicho cargue por su cuenta.
En esta entrada quiero resaltar las partes más importantes de un desarrollo en el que trabajé recientemente y que ataca esta necesidad. Básicamente se ha construido una página web que permite alojar el archivo seleccionado por el usuario y lo ubica en una carpeta temporal dentro del servidor Web. Posteriormente, una tarea programada se encarga de enviar dicho archivo al servidor de base de datos usando FTP. Una vez en el servidor de base de datos, otra tarea programada se encarga de leer y registrar los nuevos archivos cargados por el usuario. Finalmente se lee cada uno de los archivos y se realizan los cargues en las tablas finales.
Se debe crear una carpeta temporal dentro del servidor web que contendrá dos archivos. En el primero estará la declaración de la tarea FTP (Esta linea debe ir en un archivo de extensión .BAT y puede ser llamado directamente desde la aplicación web o por medio de una tarea programada):
ftp -n -s:c:\interfases\ftp_masiva.txt
Y en el segundo está la definición de la misma (siguiendo este ejemplo, este archivo deberá llamarse ftp_masiva.txt):
open
SERVER_DESTINO
user USUARIO_FTP PASSWORD_USUARIO_FTP
prompt off
lcd "URL_ORIGEN"
cd URL_DESTINO
mput *.*
bye
Importante:
- La carpeta destino debe estar correctamente configurada para aceptar el protocolo FTP. Se recomienda apoyarse para esto en un buen DBA.
- Si la URL origen es de un servidor Windows, esta debe estar entre comillas.
- Con el comando mput se pasan TODOS los archivos que estén en la carpeta origen y se mueven a la carpeta destino.
Paso 2. Registrar los archivos dentro de la base de datos.
Este ejemplo se ha realizado para un motor de base de datos Oracle, el cual según mi investigación, no contiene funciones o librerías que permitan saber los nombres de los archivos en un directorio dado. Para ello entonces, usaremos una clase Java propia que incluiremos en el motor y que será usada para esta tarea:
La clase DirList recibe por parámetro un directorio (debidamente registrado en la tabla SYS.ALL_DIRECTORIES) y, luego de aplicar algunas reglas de negocio, inserta los nombres de los archivos que serán procesados en una tabla creada para ello.
Una vez realizado el anterior punto, se debe acceder a esta funcionalidad por medio de un procedimiento de base de datos:
El procedimiento get_dir_list recibe nuevamente el directorio al cual queremos consultar y se lo pasa por llamado a la clase Java anterior.
Paso 3. Procesamiento de la información.
Contando ya con los nombres de los archivos a procesar en una tabla, se puede proceder a, por ejemplo, realizar el cargue de la información en una tabla. Una vez cargado un archivo, se pueden hacer muchas cosas con él, como por ejemplo borrarlo de la tabla temporal o moverlo a otra carpeta que lleve le histórico de cargues (para ello se pueden usar los métodos UTL_FILE.REMOVE y UTL_FILE.COPY). También se puede notificar al usuario de que el archivo ha sido procesado o ha terminado en error, usando algún paquete que envíe notificaciones por correo electrónico.
Puede que esta forma de realizar el cargue tenga muchas desventajas: El uso de tareas programadas y la configuración de permisos que puede ser problemática si no se cuenta con el apoyo de los administradores, pero es una forma rápida y relativamente sencilla de quitarnos de encima una tarea que debe ser de los usuarios y no de TI.