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 Moreira 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, solo devuelve un objeto # manipulador si la consulta es valida $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();
OJO: Para manipular variables de tamaño ilimitado en tablas (tipos LONG y LOB) hay que hacer consultas SELECT modificadas.
Bruno Contreras-Moreira