• Publicidad

Librería de Funciones DB Oracle - Autor:Gregorio Canton

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Librería de Funciones DB Oracle - Autor:Gregorio Canton

Notapor kidd » 2005-06-30 11:08 @505

Librería de Funciones DB Oracle

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]>
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Publicidad

modulos

Notapor macgregor » 2005-07-04 05:14 @260

Hola a todos.
Espero que estos modulos os sean utiles.

Ahunque se pensaron para facilitar trabajos con oracle, muchos de ellos en realidad no tienen nada que ver ni siquiera con bases de datos.

Modulos como el cronometro.pm o barra.pm se crearon para controlar el tiempo y los porcentajes de trabajo mientras se ejecuta una tarea. Se pueden usar en cualquier programa.

Tambien creo que os resultaran interesantes los modulos cola.pm y heap.pm pueden ayudar a aprender como utilizar estructuras de datos como un heap, una estructura "especial" de arbol que uso para crear colas de prioridades .... y en realidad estos modulos tampoco tienen nada que ver con bases de datos.

Para cualquier consulta de uso, critica o posible mejora ya saben, pongan sus mensajes en el foro.

Por cierto, para todos aquellos que no lo sepan, la base de datos Oracle es gratuita y de libre distribucion para todas las plataformas y sistemas operativos que existen (o casi todos).
La unica limitacion que tiene es que no puedes vender un producto desarrollado sobre oracle a un cliente sin obligarle a comprar una licencia oracle.
Para mas informacion sobre el tema y descargar software www.oracle.com

Un saludo.
MACGREGOR [TM]
Avatar de Usuario
macgregor
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2004-12-09 07:32 @355
Ubicación: españa


Volver a Módulos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados