• Publicidad

Cómo obtener filas de una tabla

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Cómo obtener filas de una tabla

Notapor Agus » 2008-12-01 09:58 @457

Hola, ¿qué tal?
¡¡Nuevamente les agradezco por la ayuda en mi primera consulta!!

Mi pregunta es la siguiente:
necesito obtener una fila determinado de una tabla pasando como parámetro el número de fila.
Todos los datos de la tabla se encuentran en @array pero si hago $array[1] no me da la primera fila sino la primera columna...

¿¿Me podrían ayudar con esto??
¡¡¡Muchas gracias!!! ¡¡¡Saludos!!!
Agus
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2008-11-27 12:03 @544

Publicidad

Notapor explorer » 2008-12-01 12:32 @564

Pero es que depende de cómo estén almacenados los datos en @array...
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

Notapor Agus » 2008-12-01 12:42 @571

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@array = $sth->fetchrow_array()
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Agus
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2008-11-27 12:03 @544

Notapor explorer » 2008-12-01 13:24 @600

Al principio de la documentación de DBI aparece el siguiente código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ( @row = $sth->fetchrow_array ) {
    print "@row\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
que quiere decir que fetchrow_array() nos devuelve, cada vez que la llamamos, la siguiente línea de la tabla resultado de la consulta a la base de datos. Como ves, el print() imprime toda la línea, y, a continuación, vuelve a while() para recuperar la siguiente línea. No nos devuelve toda la tabla de golpe, sino una fila cada vez.

Cosa distinta es si usas fetchall_arrayref(), que entonces sí que devuelve toda la tabla, en forma de una referencia a un array en que cada elemento es una referencia a cada fila.
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

Notapor Agus » 2008-12-01 13:43 @613

ok, muchas gracias por la info, pero lo que necesito es en cada acceso a la base de datos, obtener una fila del array para poder editarla y poder pasar el número de línea por vez como parámetro.
De lo contrario otra forma de resolver esto sería guardando todas las filas en un array que luego iría recorriendo para editar cada fila.
¿Con cual de las dos opciones me podrías ayudar?

¡¡Muchas gracias!!
Agus
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2008-11-27 12:03 @544

Notapor explorer » 2008-12-01 14:17 @637

Agus escribiste:ok, muchas gracias por la info, pero lo que necesito es en cada acceso a la base de datos, obtener una fila del array para poder editarla y poder pasar el número de línea por vez como parámetro.

Pero eso es lo que hace fechtrow_array()... cada vez que la llamas te devuelve una fila. Las filas te las devuelve en el orden en que salen en la tabla resultado de la consulta.

Agus escribiste:De lo contrario otra forma de resolver esto sería guardando todas las filas en un array que luego iría recorriendo para editar cada fila.
¿Con cual de las dos opciones me podrías ayudar?


Si vas a procesar toda la tabla, y la tabla sabes que cabe físicamente en la memoria del ordenador, yo me leería toda la tabla de golpe. Con una sola sentencia de fetchall_...() me la leo y a partir de ahí trabajo con ella. Si la recupero en forma de array entonces puedo referirme a sus filas a través de los índices en el array.

Si solo voy a usar una fila (o unas pocas de ellas), intentaría ajustar la consulta SQL para que me devuelva solo las filas que me interesan; y vuelvo al primer punto.

Si la tabla es tan grande que no cabe en memoria, entonces no me queda otra solución que procesar línea a línea. Posiblemente incluso tenga que guardar el resultado intermedio a disco, si es muy grande.

¡Ojo! Ten en cuenta que después de una consulta DBI, TODA la tabla de resultados es devuelta a DBI (y ocupando memoria). A partir de ella, DBI te dará lo que le pidas (en forma de array, de hash, o todo), pero eso que obtienes ocupará aún más memoria (no se reutiliza la memoria ocupada por el resultado de la consulta que está almacenando DBI). En casos muy especiales hay que hacer trucos con la función bind() y cambiar todos los for() y foreach() por while().

O... comprar más memoria para el ordenador :)
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

Notapor Agus » 2008-12-02 06:28 @311

¡Muchas gracias!
Al final lo que hice fue utilizar un push() para agregar todo el contenido de la tabla en un array.

Y el código me quedó de la siguiente manera (fragmento de código):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($sth && $sth->execute()) {
        while (@array = $sth->fetchrow_array()){
                for ($i=0; $i< 4; $i++) {
                push(@todo, $array[$i]);
                }
        }
}

print "@todo\n";

print "SET VARIABLE $FUNCIONARIO $todo[$index]";
print "SET VARIABLE $FECHAHORA $todo[$index2]\n";
print "SET VARIABLE $MENSAJE $todo[$index3]\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero ahora me sale el siguiente error para las últimas tres líneas:
Código: Seleccionar todo
Use of uninitialized value in concatenation (.) or string at /usr/share/asterisk/agi-bin/leodebd.pl line 77.
Use of uninitialized value in concatenation (.) or string at /usr/share/asterisk/agi-bin/leodebd.pl line 78.
Use of uninitialized value in concatenation (.) or string at /usr/share/asterisk/agi-bin/leodebd.pl line 79.


¿Me podrías ayudar con este error?
¡Saludos!
Agus
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2008-11-27 12:03 @544

Notapor explorer » 2008-12-02 06:57 @331

Si hubieras usado fetchall_arrayref(), te ahorrarías el push(), el while()... y tiempo de procesado.

Los errores que te salen quieren decir que alguna de las variables $FUNCIONARIO, $FECHAHORA, $MENSAJE, $index, $index2, $index3, $todo[$index], $todo[$index2] o $todo[$index3] no han sido inicializadas.
Última edición por explorer el 2008-12-02 07:38 @359, editado 1 vez en total
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

Notapor Agus » 2008-12-02 07:04 @336

Ah...supongo que no entendí el concepto... ¿me podrías pasar cómo sería el código utilizando fetchall_arrayref()?

Ya he inicializado estas variables al comienzo del script con las sentencias:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $FUNCIONARIO;
my $FECHAHORA;
my $MENSAJE;
my $UNIQUEID;
my @array;
my $index;
my $index2;
my $index3;
my $sth;
my $i;
my @todo;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Agus
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2008-11-27 12:03 @544

Notapor explorer » 2008-12-02 07:37 @359

Manejar datos desde fetchall_arrayref({})

¿Estás seguro de que tenías que declarar las variables $FUNCIONARIO, $FECHAHORA y $MENSAJE? ¿No son literales dentro del print()?
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 Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado