[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