[caracas-pm] Consulta a Informix mediante Perl DBI--Use of uninitialized value in concatenation (.) or string

Jose Angel Sanchez Acosta jasa at agroislena.com
Mon Sep 6 17:44:25 CDT 2004


Buenas noches Alexis,

Tengo instalado Infomix IDS 731 y 940 ambos en Debian GNU/Linux, he
creado algunos utilitarios con perl que acceden a la base de datos y
hasta ahora no he tenido problemas con la conexión o las consultas.

Ejemplo:

#!/usr/bin/perl

use DBI;

my $scr_name = "carga_plano.pl"; 
my $driver   = 'Informix';
my $database = 'base_de_datos at servidor'; 
my $usuario  = 'user';
my $clave    = 'pass';

my $ifx = DBI->connect("dbi:$driver:$database") || die;

my $gen_ifx = $ifx->prepare("select codigo,nombre
from clientes
where estado= ?");

$ifx->do("set isolation to dirty read");

$gen_ifx->execute($estado);
      
while (@row = $gen_ifx->fetchrow_array())
{
   print "Código: $row[0] Nombre: $row[1]|\n";
}

$gen_ifx->finish();
$ifx->disconnect();

exit;
 
El lun, 06-09-2004 a las 18:20, Alexis Arnal escribió:
> Saludos, gracias por las sugerencias, las he probado casi todas menos la
> de la ligadura, ya que no estoy muy familiarizado con esta última.
> 
> Leyendo la documentación de DBI le incluí la variable para que muestre
> el error $DBI::err. 
> 
> Estoy teniendo el siguiente problema:
> --------------------------------------------
> Conectado a la Base de Datos
> Use of uninitialized value in concatenation (.) or string at
> /var/www/cgi-bin/ejemploperl/conexperl.pl line 8.
> Use of uninitialized value in concatenation (.) or string at
> /var/www/cgi-bin/ejemploperl/conexperl.pl line 8.
> 
> Error ():
> ---------------------------------------------
> 
> El código que estoy usando es el siguiente. Lo probe en el debugger y no
> entiendo porque pierde los valores al preparar el statement
> -----------------------------------------------
> #!/usr/bin/perl -w
> use DBI;
> $driver=q%dbi:Informix:foo at bar%;
> $dbh=DBI->connect($driver) or die "\nError ($DBI::err): $DBI::errstr\n";
> print "Conectado a la Base de Datos\n";
>    
> my $sql = q{ select nombre from persona where cedula = ? };
> $stmt = $dbh->prepare($sql)or die "\nError ($DBI::err): $DBI::errstr\n";
> $stmt->execute("12345678")or die "\nError ($DBI::err): $DBI::errstr\n";
> --------------------------------------------------
> Disculpen pero estoy que casi tiro la toalla ya que esto es en teoría
> algo sencillo que debería funcionar sin problemas.
> 
> Revise los ejemplos que vienen con la documentación de DBD::Informix y
> son similares a lo que tengo en mi código.
> 
> Atte.
> Ing. Alexis Arnal
> MED. Caracas-Venezuela
> 
> 
> El lun, 06-09-2004 a las 13:38, Ernesto Hernandez-Novich escribió:
> > On Mon, 6 Sep 2004, Francisco Obispo wrote:
> > > Ernesto Hernandez-Novich wrote:
> > > >La solución final, y más elegante, es hacer la ligadura de variables del
> > > >programa a las variables libres, i.e. vincular una variable $cedula al ?
> > > >en el query, de ese modo basta hacer
> > > >
> > > >$cedula = "12345678"; $stmt->execute;
> > 
> > > No debería ser:
> > > $stmt->execute($cedula);
> > 
> > No, precisamente en el párrafo previo hago énfasis en vincular la
> > variable al ?. Esa vinculación _no_ es en el execute(), sino utilizando
> > la rutina bind_param() que _adrede_ no incluí.
> > 
> > > Para lo cual el orden de izquierda a derecha en que aparezcan los ? ,
> > > serán reemplazados
> > > por las variables debidamente "comilladas" según el tipo de datos.
> > 
> > Precisamente el uso de ligadura te permite olvidarte del "orden" y
> > simplemente agregas y quitas variables a tu consulta posicionalmente.
> > 
> > > En caso de que se quiera efectuar este tipo de comportamiento,
> > > tendrás que "ligar" estas variables con los "Marcadores de lugar" o
> > > Placeholders,
> > 
> > Eso es lo que quise decir con vincular.
> 
> _______________________________________________
> caracas-pm mailing list
> caracas-pm at mail.pm.org
> http://www.pm.org/mailman/listinfo/caracas-pm
-- 




More information about the caracas-pm mailing list