[caracas-pm] PERL DBI+Procedimientos Almacenados en Postgres
Alexis Arnal
aarnal at gmail.com
Mon Apr 11 12:50:06 PDT 2005
Saludos,
Seguimos luchando con los procedimientos almacenados en Postgres.
Hemos logrado hacerlos funcionar desde dentro de Postgres pero no
hallamos la manera de ejecutarlos desde una aplicación desarrollada en
PERL que utiliza el módulo DBI para acceder a la base de datos.
Esto es lo que estamos probando:
Tengo una tabla tdatos_personales con dos campos
ci | nombre
---|----------
1 | ALEXIS
Está es la función que crea el cursor y lo abre
------------------------------------------------------------
CREATE OR REPLACE FUNCTION reffunc(refcursor) RETURNS refcursor AS '
BEGIN
OPEN $1 FOR SELECT * FROM tdatos_personales;
RETURN $1;
END;
' LANGUAGE plpgsql;
BEGIN;
--------------------------------------------------------------
Luego lo ejecutamos esto desde la consola de postgres:
---------------------------------------------------------------
SELECT reffunc('funccursor');
FECTH ALL IN funccursor;
COMMIT
----------------------------------------------------------------
Y funciona perfecto.
El problema es cuando queremos ejecutar lo anterior desde una
aplicación que accede a la base de datos por medio de PERL DBI.
Este es el código perl:
-----------------------------------------------------------------
#!/usr/bin/perl -w
#SCRIPT QUE SE CONECTA AL SERVIDOR PARA LLENAR LAS TABLAS
use DBI;
$user="alexis";
$password='1234';
$host = '127.0.0.1';
$port= 5432;
$driver="dbi:Pg:dbname=dbprueba;host=$host;port=$port";
unless ($dbh= DBI -> connect($driver,$user,$password)) {
print "\n *** No se pudo contactar el servidor ***\n";
}
$preparar = $dbh -> prepare("SELECT reffunc('funccursor')");
$statement = $preparar or die "\nError ($DBI::err): $DBI::errstr\n";
$statement -> execute or die "\nError ($DBI::err): $DBI::errstr\n";
$preparar = $dbh -> prepare("FETCH ALL IN funccursor");
$statement = $preparar or die "\nError ($DBI::err): $DBI::errstr\n";
$statement -> execute or die "\nError ($DBI::err): $DBI::errstr\n";
$datos = $statement -> fetchrow_array;
print "datos";
-----------------------------------------------------------------
Esto arrojo un ERROR(7): No existe el cursor <<funccursor>>
Si por favor me pueden decir que estoy haciendo mal se lo agradezco;
si existe otra manera de hacerlo más eficiente mucho mejor, si saben
de un link donde pueda encontrar ejemplos para comoparar tambien me
sirve,
Tambien me gustaría saber su opinión acerca de PL/Perl ya que tambien
lo estamos evaluando, sin resultados positivos.
Atte.
Alexis Arnal
More information about the caracas-pm
mailing list