Sentencias SELECT

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
http://www.eead.csic.es/compbio