• Publicidad

Error de DBI en dos ciclos de consultas

Todo acerca de las bases de datos que existen: SQL, MySQL, Oracle, Postgres, CSV, etc.

Error de DBI en dos ciclos de consultas

Notapor seafree » 2014-03-27 11:54 @537

Hola.

Realizo varias consultas dentro de dos ciclos y en la última de las consultas arroja: Can't call method "prepare" on an undefined value. ¿Me puedes asesorar en cuál puede ser el error? Creé una segunda variable $dbh_fe, el correspondiente $sth_fe y el correspondiente while ($reg_fentra = $sth_fe->fetchrow_hashref()) { pero no arroja resultado alguno.

¿Me podrás apoyar, por favor, con alguna idea, por favor? Gracias.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Publicidad

Re: Error de DBI en dos ciclos de consultas

Notapor explorer » 2014-03-27 12:40 @569

Sin ver el código, es difícil...

Apuesto a que el segundo ciclo agota todas las respuestas, y la segunda vuelta del primer ciclo es la que da el fallo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error de DBI en dos ciclos de consultas

Notapor seafree » 2014-03-27 13:17 @595

Ok, mira, el programa está algo extenso por lo que creo que lo mejor es enviarte las líneas correspondientes:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #############------##############
  2. my $dbh;
  3. my $sth;
  4. my $sql;
  5. my $sql_evento;
  6. my $reg_dcev;
  7. my $sql_max_fsale;
  8. my $dbh_fe;
  9. my $sth_fe;
  10.  
  11. $dbh          = DBI->connect( "DBI:Pg:dbname=eventos;host=localhost", "seafree", "", { 'RaiseError' => 1 } );
  12. $sql          = "SELECT......";
  13. $sql_eventos  = "SELECT.....";
  14. $sql_eventos2 = "SELECT....";
  15. $sth          = $dbh->prepare($sql) or die $DBI::errstr;
  16. $sth->execute();
  17. while ( $reg_dcev = $sth->fetchrow_hashref() ) {
  18.     ...;
  19.     ...;
  20.     ...;
  21. }                                      #END WHILE ($reg_dcev = $sth->fetchrow_hashref)
  22. $sth_event2 = $dbh->prepare($sql_eventos2) or die $DBI::errstr;
  23. $sth_event2->execute();
  24. while ( $reg_dcev_event2 = $sth_event2->fetchrow_hashref() ) {
  25.  
  26. }                                      #END WHILE ($reg_dcev = $sth->fetchrow_hashref)
  27.  
  28. #############################################
  29. ###---EN EL SIGUIENTE TENGO EL PROBLEMA---###
  30. #############################################
  31. $sth_fe = $dbh->prepare($sql_eventos) or die $DBI::errstr;
  32. $sth_fe->execute();
  33. $tuplas = $sth_fe->rows;               ###SÍ ME ESTÁ ARROJANDO UNA TUPLA, PORQUE SÓLO ES UNA CON EL VALOR MÁXIMO
  34.  
  35. while ( $reg_fe = $sth_fe->fetchrow_hashref() ) {
  36.     if ( $descrip_aux ne $descrip_comp ) {    # Creo una condición para cuando sea un diferente grupo "descrip_comp"
  37.         $sql_max_fsale
  38.             = "SELECT MAX(fecha_entra) FROM (SELECT id,descrip_comp,fecha_sale,fecha_entra FROM t_eventos te, c_tipo_componentes ctc, c_componentes cc WHERE (fecha_sale BETWEEN '$f_ini' AND '$f_fin') AND indice='S' AND te.id_tipo_componente=ctc.id_tipo_componente AND ctc.id_componente=cc.id_componente GROUP BY id,descrip_comp,fecha_sale,fecha_entra ORDER BY descrip_comp,fecha_entra) AS subquery WHERE descrip_comp=\'$descrip_comp\' GROUP BY descrip_comp";
  39.         $sth_fe = $dbh->prepare($sql_max_fsale) or die $DBI::errstr;
  40.         $sth_fe->execute();
  41.         $tuplas_max_fentra = $sth_fe->rows;
  42.         while ( $reg_fentra = $sth_fe->fetchrow_hashref() ) {
  43.             $fentra = $reg_fentra->{'fecha_entra'};
  44.             print $fentra              ## Envía valores vacíos y la consulta sí me da el resultado esperado
  45.         }
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


¿Puedes encontrar algo con este código?
Última edición por explorer el 2014-03-27 14:01 @626, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: Error de DBI en dos ciclos de consultas

Notapor explorer » 2014-03-27 14:14 @634

Sí que veo algo...

En la línea 35 extraes el resultado de la consulta, en forma de referencia a un hash, y lo guardas en la variable escalar $reg_fe... que luego no usas en el resto del código...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error de DBI en dos ciclos de consultas

Notapor seafree » 2014-03-27 14:26 @643

No, mira, la línea 35 está compuesta así:

$sth_fe= $dbh->prepare($sql_max_fsale) or die $DBI::errstr;
$sth_fe->execute();
$tuplas_max_fentra=$sth_fe->rows;
while($reg_fentra = $sth_fe->fetchrow_hashref()) {
$fentra=$reg_fentra->{'fecha_entra'};
print "FECHA ENTRA: $fentra<br>";
}

Por error tome otra línea o algo pasó. Como puedes ver el valor que obtengo con la consulta es el valor máximo de la fecha de entrada, es decir, solo me da un valor como resultado. Al ejecutar la consulta directamente en la base de datos sí me arroja un resultado, pero en el programa, nada.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Re: Error de DBI en dos ciclos de consultas

Notapor seafree » 2014-03-27 14:42 @654

¡Ups! Era algo tan simple que es una verdadera pena que haya pasado esto.

Era la asignación del MAX(fecha_entra) a un alias, es decir, MAX(fecha_entra) AS fecha_entra y asignar ese valor como ya estaba: $fentra = $reg_fentra->{'fecha_entra'}; Lo que pasa es que quería utilizar el valor de 'fecha_entra' sin asignarlo a un alias.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518


Volver a Bases de datos

¿Quién está conectado?

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