[caracas-pm] Problema al conectarme con Oracle 8i y DBI

Ernesto Hernandez-Novich emhnemhn at gmail.com
Wed Aug 22 09:22:48 PDT 2007


On Wed, 2007-08-22 at 12:02 -0400, Daniel Rojas wrote:
> Buenas amigos les escribo en la oportunidad de comentarles un problema
> que tengo al conectarme a un servidor Oracle 8i, es una conexion
> sencilla donde consulto una tabla, el problema es que cuando acceso a
> tablas con pocos registros, me trae los datos pero cuando acceso a una
> tabla que contiene 1.638.237 registros, se queda como 20 segundos
> esperando y a la final arroja un error
> 
> este es el string de
> conexion:---------------------------------------------------------
> 
> prueba2.pl:
> 
> use strict;
> use DBI;
> 
> my $dbh = DBI->connect( 'dbi:Oracle:ADIN',
>                         'myusuario',
>                         'myclave',
>                         {
>                           RaiseError => 1, 
>                           AutoCommit => 0
>                         }
>                       ) || die "Database connection not made:
> $DBI::errstr";
> 
> my $sql = qq{ SELECT * FROM gl_balances where set_of_books_id = 344
> and    code_combination_id = 166823 and currency_code = 'VEB'}; 
> my $sth = $dbh->prepare( $sql );

Si la instrucción SQL es estática, no tiene mayor sentido prepararla. Si
piensas utilizar la misma instrucción SQL para varias consultas,
entonces deberías tener placeholders (?) en lugar de los valores
concretos (344, 166823 y 'VEB') y luego llamar al execute() con esos
parámetros.

> $sth->execute();

Completando el comentario anterior, el SQL debería ser parametrizado con
placeholders y ejecutar

$sth->execute(344,166823,'VEB');

Hasta aquí, todo bien.

> print $sth;

No se hace "print $sth". Hacer eso (si te fijaste en el manual) es
equivalente a solicitar UN string con TODOS los registros. UN string...
TODOS los registros... Eso no es razonable cuando tienes muchos
registros por razones (espero obvias) de consumo de memoria. 

Lo que quieres hacer es iterar sobre los resultados para procesarlos
fila por fila

while ( my @fila = $sth->fetchrow_array ) {
  # @fila contiene todos los campos de una fila
}

Vuelve a leer los manuales de DBI, porque precisamente al comienzo están
los ejemplos de uso para un SELECT, independientemente del número de
filas a retornar.

Hoy en día hay muy pocas razones para utilizar DBI directamente. Es
preferible que utilices un ORM como DBIx::Class para tus operaciones de
SQL de manera que nunca tengas que escribir SQL y así, detalles como los
que mencioné de preparar, parametrizar e iterar, sean manejados por una
librería en lugar de tener que recordarlos cada vez.
-- 
Ernesto Hernández-Novich - Linux 2.6.18 i686 - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't aptitude it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3



More information about the caracas-pm mailing list