Las tareas más comunes entre un script en Perl y la BD es obtener datos de
la misma. En SQL, este proceso se realiza con una sentencia SELECT.
El proceso de obtener datos usando DBI se divide en cuatro etapas:
-
Preparación: En esta
etapa se analiza y valida la sentencia SQL y se devuelve un manejador de
sentencia representando la sentencia en la base de datos. Se utiliza el
método prepare (con la consulta SQL como parámetro)
del manejador de la base de datos,
devolviendo el manejador de la sentencia.
-
Ejecución: En esta
etapa se ejecuta el manejador de sentencia obtenido en la etapa anterior.
En esta etapa se hace la consulta y se almacenan los datos en las
estructuras de datos correspondientes de la BD, aunque en esta etapa, el
script en Perl no puede acceder a los datos obtenidos. Se utiliza
el método execute del manejador de sentencia.
-
Extracción: En esta
etapa se captan los datos de la base de datos usando el manejador de
sentencia. En dicha captación de datos se va almacenando los datos
consultados, tupla a tupla en las estructuras de datos de Perl, para que
sean posteriormente manipulados por el script.
-
Liberación: En esta
fase se liberan los recursos ocupados por el manejador de sentencia y por
la base de datos. Se utiliza el método finish del manejador
de sentencia.
Veamos un ejemplo en la base de datos del ejemplo anterior
donde se realiza una consulta para obtener información
de la base de datos:
#!/usr/bin/perl
#Usamos las librerias de acceso a BD
use DBI;
my $base_datos="ce"; #Nombre de las base de datos
my $usuario="root"; #Usuario de la BD
my $clave="richal"; #Password de la BD
my $driver="mysql"; #Utilizamos el driver de mysql
my $tabla="articulos"; #Nombre de la tabla de ejemplo
#Conectamos con la BD, si no podemos, ponemos un mensaje de error
my $dbh = DBI->connect("dbi:$driver:$base_datos",$usuario,$clave) || die "\nError al abrir la base datos: $DBI::errstr\n";
#Decimos que hemos conectado
print "\nSe ha conectado con la BD $base_datos del driver $driver\n";
#Realizamos la etapa de preparación de la sentencia
my $sth = $dbh->prepare("SELECT id,nombre FROM articulos;");
#Realizamos la etapa de ejecución de la sentencia
$sth->execute();
#Realizamos la etapa de extracción de datos. Imprimimos tupla a tupla.
while ( @tupla=$sth->fetchrow_array())
{
print "C›digo:$tupla[0] Nombre: $tupla[1]\n";
}
#Realizamos la etapa de liberación de recursos ocupados por la sentencia
$sth->finish();
#Nos desconectamos de la BD. Mostramos un mensaje si hay
#algun fallo
$dbh->disconnect || warn "\nFallo al desconectar.\nError: $DBI::errstr\n";
#Terminamos
exit;
El ejemplo anterior está aquí.
Para la extracción de datos provenientes de la consulta, DBI
nos proporciona una serie de métodos del manejador de la sentencia:
- fetchrow_array: Devuelve un array con los atributos
de la consulta de cada tupla. Cada vez que se invoque devolverá una
tupla y avanzará el cursor a la siguiente tupla. Si devuelve un
array vacío, es que no quedan más tuplas.
Ejemplos: @tupla= $sth->fetchrow_array();
($codigo,$nombre)=$sth->fetchrow_array();
- fetchrow_arrayref: Es análogo al método
anterior, pero devuelve una referencia a un array
en lugar del array en si. Esto se hace así por que es más
rápido devolver un array que copiarlo.
Ejemplo: $tupla_ref= $sth->fetchrow_arrayref();
print "Código:$tupla_ref->[0] Nombre: $tupla_ref->[1]\n";
- fetchrow_hashref: Este método devuelve una
referencia a una matriz asociativa (hash), donde las claves son los
nombres de los campos consultados con la sentencia SELECT.
Ejemplo: $hash_tupla_ref= $sth->fetchrow_hashref();
print "Código:$hash_tupla_ref->{id} Nombre: $hash_tupla_ref->{nombre}\n";