• Publicidad

Perl y DBI

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

Perl y DBI

Notapor ridomil » 2012-04-24 07:58 @374

Muy buenas, me presento me llamo Iván y estoy desarrollando con Perl, CGI y DBI.

Bueno, al lio, resulta que estoy recuperando de una BD el valor de un campo. Este valor es un 0 pero cuando hago la consulta con Perl y obtengo el valor de la referencia me devuelve un 1 en el log... Os pongo la subrutina:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub comprobarNDocsTiposFuentes {
  2.  
  3.     my ( $self, $tipoComprobar ) = @_;
  4.  
  5.     $self->guardarLog( "Valor que llega a la funcion COMPROBAR......................" . $self->{_idFuente} );
  6.     $self->guardarLog( "Valor que llega a la funcion COMPROBAR....................." . $tipoComprobar );
  7.  
  8.     $self->{_manejador} = $self->{_conexion}->prepare(
  9.         "SELECT TRel_NDocs
  10.                                 FROM T_Tipos_x_Fuentes
  11.                                 WHERE TRel_Tipo='" . $tipoComprobar . "'
  12.                                 AND TRel_Fuente='" . $self->{idFuente} . "'"
  13.     ) or $self->guardarLog( "[obtenerNumeroDocumentos] Preparacion: " . DBI::errstr );
  14.  
  15.     $self->{_manejador}->execute() or $self->guardarLog( "[ObtenerNumeroDocs] Ejecucion: " . DBI::errstr );
  16.  
  17.     while ( my $ref = $self->{_manejador}->fetchrow_arrayref() ) {
  18.         $self->{'_numeroDocumentos'} = $ref->[0];
  19.         $self->guardarLog( "VALOR DEL NUMERO DE DOCUMENTOS CON LA REFERENCIA ARRAY ....-----> " . $ref->[0] );
  20.         $self->guardarLog( "VALOR DEL NUMERO DE DOCUMENTOS CON LA REFERENCIA ARRAY ....-----> " . $ref->[1] );
  21.         $self->guardarLog( "VALOR DEL NUMERO DE DOCUMENTOS CON LA REFERENCIA ARRAY ....-----> " . $ref->[2] );
  22.         $self->guardarLog(
  23.             "VALOR DEL NUMERO DE DOCUMENTOS CON LA REFERENCIA ARRAY ....----->" . $self->{'_numeroDocumentos'} );
  24.     }
  25.  
  26.     $self->guardarLog( "[ObtenerNumeroDocumentos] Resultado: " . DBI::errstr ) if DBI::errstr;
  27.     $self->{_manejador}->finish();
  28. }
  29.  
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4


El valor que me devuelve en el Log es 1, sin embargo en BD este valor con los mismos datos que utiliza para realizar la consulta es 0. Y la verdad es que no lo entiendo...

Muchas gracias de antemano.
ridomil
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2012-04-24 07:52 @370

Publicidad

Re: Perl y DBI

Notapor explorer » 2012-04-24 12:20 @556

Bienvenido a los foros de Perl en Español, ridomil.

No sé muy bien dónde puede estar el error, pero podrías escribir mejor el prepare() / execute().

Podría ser así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     $self->{_manejador} = $self->{_conexion}->prepare(
  2.         "SELECT TRel_NDocs FROM T_Tipos_x_Fuentes WHERE TRel_Tipo=? AND TRel_Fuente=?"
  3.     ) or $self->guardarLog( "[obtenerNumeroDocumentos] Preparacion: " . DBI::errstr );
  4.  
  5.     $self->{_manejador}->execute($tipoComprobar, $self->{idFuente})
  6.         or $self->guardarLog( "[ObtenerNumeroDocs] Ejecucion: " . DBI::errstr );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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: Perl y DBI

Notapor ridomil » 2012-04-25 02:01 @125

Una de mis principales dudas es si existe alguna otra forma de extraer el valor de forma única es decir, de extraer unicamente ese valor de la consulta. Sin utilizar un arrayref() o hashref(). La verdad es que es algo bastante raro.
ridomil
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2012-04-24 07:52 @370

Re: Perl y DBI

Notapor explorer » 2012-04-25 10:17 @470

Me he dado cuenta de una cosa: estás haciendo un SELECT de un solo campo.

Así, al hacer un fetchrow_arrayref(), estás obteniendo una referencia a un array que solo tiene un elemento.

Así, dentro del bucle, solo debería existir $ref->[0], y no $ref->[1] ni $ref->[2] y siguientes.

Lo puedes simplificar un poco más:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     while ( my($ndocs) = $self->{_manejador}->fetchrow_array() ) {
  2.         $self->{'_numeroDocumentos'} = $ndocs;
  3.         $self->guardarLog( "VALOR DEL NUMERO DE DOCUMENTOS CON LA REFERENCIA ARRAY ....-----> $ndocs" );
  4.     }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Los paréntesis que rodean a $ndocs son importantes. Marcan que queremos ejecutar a fetchrow_array() en contexto lista. Ella nos devuelve entonces la lista de valores de la cada fila del resultado. Como esa fila solo tiene un valor, es el que se almacena en $ndocs.
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


Volver a Bases de datos

¿Quién está conectado?

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