[caracas-pm] Re: [l-desarrollo] Consulta a Informix mediante Perl DBI

Ernesto Hernandez-Novich emhn at telcel.net.ve
Fri Sep 3 20:46:18 CDT 2004


On Fri, 3 Sep 2004, Alexis Arnal wrote:
> Ya pude conectarme a la base de datos Informix, sin embargo ahora me
> surgió un problema al realizar una consulta.
[...]
> $statement=$dbh->prepare("SELECT nombre from tpersona where
>                          cedula='12345678'")

No es una buena idea usar "comilleo" (lo mejor que se me ocurre por
"quoting") explícito en  DBI porque cada manejador las trabaja
diferentes. En Oracle y PostgreSQL, las cadenas se encierran entre
comillas sencillas, pero en Informix (si mal no recuerdo) con comillas
dobles. De modo que una solución primitiva sería

  my $sql = q{ select nombre from tpersona where cedula = "12345678" };
  $stmt = $dbh->prepare($sql);

Pero aún así, esto tiene dos cosas feas: primero, el hecho de usar
las comillas explícitamente; segundo, como el query tiene "cableado" el
valor de búsqueda, el query no es reutilizable con facilidad. La manera
adecuada de hacer este tipo de cosas es

  my $sql = q{ select nombre from tpersona where cedula = ? };
  $stmt = $dbh->prepare($sql);
  $stmt->execute("12345678");

porque el execute() se encarga del "comilleo" adecuado (le deja ese
trabajo al DBD, como debe ser), el query está parametrizado con lo que
cualquier otra consulta _idéntica_ en la cual sólo cambie el valor de
búsqueda utilizará la misma consulta, y se puede reutilizar en el propio
programa Perl con facilidad.

La solución final, y más elegante, es hacer la ligadura de variables del
programa a las variables libres, i.e. vincular una variable $cedula al ?
en el query, de ese modo basta hacer

$cedula = "12345678"; $stmt->execute;

y DBI sabe que debe utilizar el valor de $cedula en el lugar del ?.
Revisa la documentación de DBI al respecto. Con ésta técnica los
programas resultan mucho más claros, fáciles de mantener, y aprovechas
mejor las facilidades del manejador de base de datos.

> while (( $cedula,$nombre)=$statement->fetchrow_array){
> 		print " $cedula|$nombre|\n";

Lo mismo aquí. Usar ligaduras es mucho más elegante y eficiente, sobre
todo si piensas manipular grandes cantidades de datos.

> Otro problema es que al parecer no valida el usuario y el password, ya
> que los cambie arbitrariamente y se seguía conectándose.

Ese es un problema de configuración del manejador de base de datos; el
DBA no está siendo suficientemente estricto al aceptar conexiones
remotas. No es un problema de Perl ni del DBI/DBD.
-- 
Ernesto Hernández-Novich - On Linux 2.6.8.1 i686 - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't apt-get it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3


More information about the caracas-pm mailing list