Usaremos el método
DBI::prepare()
para crear un objeto manipulador
(statement handler) y luego el método
execute()
de este nuevo objeto para efectivamente manipular la base de datos.
#!/usr/bin/perl -w
# Ejemplo escrito por Bruno Contreras en Agosto de 2005
use strict;
use DBI;
## por Dios, trata de conectarlo, Carlos
my $conexion = DBI->connect("dbi:mysql:test:servidor.ccg.unam.mx","usuario","clave",{
PrintError => 0, ### avisa si hay errores mediante warn
RaiseError => 1 ### avisa y termina si hay errores mediante die
}
);
## ahora manipula la base de datos mediante consultas SQL
my $tabla = "blast";
my $consulta="SELECT hit FROM $tabla WHERE evalue < 1e-03";
my $manipulador = $conexion->prepare($consulta); # normalmente, sólo devuelve un objeto
# manipulador si la consulta es válida
$manipulador->execute();
while (my @datos=$manipulador->fetchrow_array) # puedes usar fetchrow_hash con columnas como claves
{
# haz algo con estos datos, como imprimirlos
foreach my $dato (@datos)
{
print "$dato,";
}
}
$manipulador->finish();
$conexion->disconnect();
Otra manera útil de capturar la salida de una consulta sería:
use strict;
use DBI;
my $conexion = DBI->connect("dbi:mysql:test:servidor.ccg.unam.mx","usuario","clave",{PrintError,0,RaiseError,1});
my $consulta="SELECT * FROM blast WHERE evalue < 1e-03";
my $manipulador = $conexion->prepare($consulta);
$manipulador->execute();
my $ref_arreglo = $manipulador->fetchall_arrayref(); # referencia a un arreglo que contiene
# los resultados
$conexion->disconnect();
Otra manera alternativa de mostrar los resultados de una consulta SQL SELECT podría ser:
use strict;
use DBI;
my $conexion = DBI->connect("dbi:mysql:test:servidor.ccg.unam.mx","usuario","clave",{PrintError,0,RaiseError,1});
## ahora manipula la base de datos mediante consultas SQL
my $tabla = "blast";
my $consulta="SELECT hit FROM $tabla WHERE evalue < 1e-03";
my $manipulador = $conexion->prepare($consulta);
$manipulador->execute();
# imprime todos los resultados obtenidos de la consulta
$manipulador->dump_results();
# guarda los resultados en un archivo en formato de 80 columnas
$manipulador->execute();
open(CONSULTA,">resultados.txt") || die "no puedo crear resultados.txt\n";
$manipulador->dump_results(80, "\n", ':', \*CONSULTA);
$conexion->disconnect();
Finalmente os muestro una forma de hacer tus programas con DBI más comprensibles, usando el
método bind_columns:
use strict;
use DBI;
my $conexion = DBI->connect("dbi:mysql:test:servidor.ccg.unam.mx","usuario","clave",{PrintError,0,RaiseError,1});
## ahora manipula la base de datos mediante consultas SQL
my ($hit,$evalue); # columnas de $tabla
my $tabla = "blast";
my $consulta="SELECT hit,evalue FROM $tabla WHERE evalue < 1e-03";
my $manipulador = $conexion->prepare($consulta);
$manipulador->execute();
# asocia columnas de salida con sus nombres
$manipulador->bind_col( 1, \$hit );
$manipulador->bind_col( 2, \$evalue );
# procesa la salida
while ($manipulador->fetch())
{
print "$hit $evalue\n";
}
$conexion->disconnect();
Para manipular variables de tamaño ilimitado en tablas (tipos LONG y LOB) hay que hacer consultas SELECT modificadas, que podéis ver aquí.