Introducción del Autor
Esta es una serie de módulos totalmente en Castellano creados principalmente para agilizar la inserción masiva de datos en una base de datos ORACLE. Sin embargo al basarse y usar el modulo DBI este modulo se puede usar para conectar y trabajar con muchas otras DB, no solo Oracle.
Lo primero que debo decir es que todo el mérito de esta serie de módulos lo tiene Eduard Suñen Piñol, gracias a él aprendí a programar en perl.
En el momento de la creación de estos módulos se pensaron para ejecutarse en un servidor Windows en el que estaba instalada una DB Oracle llamada BIBLIOMETRIC, y la conexión se realizaba a través de ODBC creando un TNSnames de sistema.
He probado estas librerías en Linux utilizando el driver "oracle" para DBI (modulo DBI::Oracle de CPAN) ya que el driver ODBC para Unix/Linux es de PAGO!
También he utilizado este mismo driver "DBI::Oracle" desde Windows, lo que sucede es que solo esta disponible para perl 5.6 y no para la 5.8
De la misma forma se puede usar cualquier otro driver para el modulo DBI, ya sea postgres sql o mysql, y los resultados deberían ser buenos.
Descripción del módulo
Funciones del paquete GestorDatos son las más usadas:
- Código: Seleccionar todo
sub Nuevo($nombre,$usuario,$password)
Crea un nuevo gestor de datos que apuntará a un objeto ODBC o al driver especificado.
sub Conectar
Establece la conexión a la base de datos
sub Desconectar
Desactiva una conexión a la base de datos previamente establecida
sub Consultar($sentencia):@resultados
Hace una consulta y devuelve la primera fila como un vector
sub SimularSentencia($id,$sentencia)
Escribe la sentencia en el diario
sub SimularSentenciaParametrizada($id,$sentencia,@parametros)
Escribe la sentencia en el diario
sub ErrorSentencia($id,$sentencia)
Escribe en el diario: ERROR AL EJECUTAR sentencia (en caso de error)
sub ErrorSentenciaParametrizada($id,$sentencia,@parametros)
Escribe en el diario: ERROR AL EJECUTAR sentencia y parámetros (en caso de error)
sub Ejecutar($id,$sentencia,@parametros)
Ejecuta cualquier tipo de sentencia, con o sin parámetros
sub EjecutarSentencias($id,@sentencias)
Ejecuta una lista de sentencias SIN PARAMETROS
sub LeerCursor($sentencia,$funcion)
Ejecuta una consulta y, para cada fila llama a la función pasándole como parámetros los elementos de cada columna
Las funciones del Diario.pm se crearon con la intención de gestionar los enormes logs que se necesitaban crear al realizar inserciones masivas de datos. De ahí algunas funciones que tabulan y destabulan el texto del fichero/s de log.
Al crear el "Diario" se puede especificar que cree un log completo con absolutamente todo, uno resumido o se puede no poner ningun fichero.
- Código: Seleccionar todo
Sub Apuntar($cadena)
Escribe en pantalla y en los ficheros de log
Sub Anotar($cadena)
Escribe solo en el log completo
Sub Mostrar($cadena)
Escribe solo en pantalla
Sub Chivato($cadena)
Escribe en pantalla y en el log completo si existe, útil para rastrear errores
Manual del módulo
En algunos de los archivos .pm de esta serie de modulos se deberá cambiar "BIBLIOMETRIC" por el nombre de vuestra base de datos (lamentablemente no se como parametrizar el nombre de la base de datos en dichas librerias).
Si ejecutas tus programas perl en el mismo servidor en el que se encuentra la DB:
En la linea nº40 del modulo GestorDatos.pm podemos ver lo siguiente.
- Código: Seleccionar todo
$gestor_datos->{Apuntador} = connect("dbi:ODBC:$gestor_datos->{Nombre}", "$gestor_datos->{Usuario}", "$gestor_datos->{Password}");
Aquí es donde se puede cambiar el driver. Solo hay que sustituir "ODBC" por "oracle" o cualquier driver que queráis utilizar.
Actualmente estoy ejecutando mis cgi's en un servidor Linux con ip publica que envia las peticiones a otro servidor Windows que se encuentra en una red privada donde esta la Base de Datos Oracle.
La linea anterior se debe modificar con lo siguiente para esta otra configuración:
- Código: Seleccionar todo
my $IP="666.666.666.666";
$gestor_datos->{Apuntador} = DBI->connect("dbi:Oracle:(DESCRIPTION =
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = $IP)(PORT =
1521)))(CONNECT_DATA =
(SERVICE_NAME=$gestor_datos->{Nombre})))","$gestor_datos->{Usuario}",
"$gestor_datos->{Password}");
Ejemplo
- Código: Seleccionar todo
#!/perl/bin/perl -w
# "d:/librerias/perl" directorio donde se ponen los modulos, se usan sin instalar
push(@INC,'pwd','d:/librerias/perl');
require GestorDatos;
require Diario;
require Sequences;
require DBI;
require Cronometro;
$anyo='2003';
$diario=Nuevo Diario("CargarArticulos-NCR-$anyo.log");
$crono=Nuevo Cronometro;
$crono->Iniciar();
sub funcion_que_se_ejecuta_por_cada_fila_de_datos_recibida
{
codigo de la funcion;
}
sub TratarArticuloNCR
{
codigo;
}
$SI=1;
$NO=0;
$SIMULAR=$NO;
$diario->Apuntar("Diario de la carga de articulos del NCR 81-2002 al
BIBLIOMETRIC.\n");
$diario->Apuntar("==============================================================\n");
$BIBLIOMETRIC=Nuevo GestorDatos('BIBLIOMETRIC','usuario','password');
#nombre base de datos, usuario, password
$BIBLIOMETRIC->{Diario}=$diario;
$BIBLIOMETRIC->{Simular}=$SIMULAR;
$BIBLIOMETRIC->Conectar;
#Gestion de las secuencias de la base de datos se pueden usar las
propias de oracle o simular unas propias.
$sequences=Nuevas Sequences($BIBLIOMETRIC,$diario);
$sequences->{UtilizarSequencesBaseDeDatos}=$NO; #NO para usar
secuencias propias.
$SEQ_ARTICLE=$sequences->Anadir('SEQ_ARTICLE','TBL_ARTICLE','L_ARTICLE_ID');
$SEQ_ENTITY=$sequences->Anadir('SEQ_ENTITY','TBL_ENTITY','L_ENTITY_ID');
$SEQ_ENTRY=$sequences->Anadir('SEQ_ENTRY','TBL_ENTRY','L_ENTRY_ID');
$sequences->Resincronizar;
#CARGAR LAS REVISTAS
$BIBLIOMETRIC->LeerCursor("SELECT DISTINCT JO.L_JOURNAL_ID,
ENTAT.ST_VALUE FROM BIBLIOMETRIC.TBL_JOURNAL JO,
BIBLIOMETRIC.TBL_ENTITY_ATTRIBUTE ENTAT WHERE JO.L_ENTITY_ID =
ENTAT.L_ENTITY_ID",'main::funcion_que_se_ejecuta_por_cada_fila_de_datos_recibida');
$diario->Apuntar("Revistas cargadas\n");
@num_art_tot=$BIBLIOMETRIC->Consultar("SELECT COUNT (AUX.ISI_LOC) FROM
BIBLIOMETRIC.AUX_NCR2002_ARTICLES AUX WHERE AUX.SOURCEYEAR =
\'$anyo\'");
$BIBLIOMETRIC->LeerCursor("SELECT A.ISI_LOC, A.JNL_TITLE, A.VOLUME,
A.PAGE, A.SOURCEYEAR, A.KCODE, A.ARTL_TITLE, A.TOT_CITES FROM
BIBLIOMETRIC.AUX_NCR2002_ARTICLES A WHERE A.SOURCEYEAR =
\'$anyo\'",'main::TratarArticuloNCR');
$diario->Apuntar("EXISTENTES=$existentes, NUEVOS=$nuevos\n");
@fecha=$BIBLIOMETRIC->Consultar("select
to_char(sysdate,'DD:MM:YYYY:HH24:MI:SS') from dual");
$BIBLIOMETRIC->Desconectar;
$diario->Anotar("\nFinal del programa : $fecha[0] \n");
$diario->Cerrar;
$crono->Parar();
$crono->Mostrar();
1;
Los Archivos
librerias.zip
Archivos contenidos en el módulo:
- Código: Seleccionar todo
libreria
|_Barra.pm
|_cola.pm
|_cronometro.pm
|_Diario.pm
|_EntradaSalida.pm
|_GestorDatos.pm
|_heap.pm
|_Sequence.pm
|_Sequences.pm
|_sets.pm
|_util.pm
Autor
Gregorio Manuel Canton Gomez <[email protected]>