Re: Ayuda: Como escribir cursores en plperl?

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Ricardo David Carrillo Sánchez <ricardo(dot)carrillo(at)yahoo(dot)com(dot)mx>
Cc: pgsql-es-ayuda(at)postgresql(dot)org, David Carrillo Sanchez <davxoc(at)gmail(dot)com>
Subject: Re: Ayuda: Como escribir cursores en plperl?
Date: 2007-07-04 20:16:21
Message-ID: 20070704201621.GI5035@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Ricardo David Carrillo Sánchez escribió:
> Hola a todos!! estuve investigando como utilizar plperl para crear
> funciones procedurales mediante perl,pero me surge una duda, esperando
> que uds, me pudieran ayudar,
>
> he tratado de escribir una funcion que me permite pasar datos de una
> tabla a otra, tratando de normalizarla en el camino, de lo siguiente
> me queda esot :

Bueno, esta todo malo porque estas mezclando PL/pgSQL con Perl y con
SQL. De partida no puedes usar DECLARE, ni darle instrucciones SQL
directamente; el codigo que va es totalmente Perl. Mira abajo:

> CREATE OR REPLACE FUNCTION apellidos() RETURNS text AS $$
> DECLARE
> curselect CURSOR FOR select nombrec,apel,cargo,enlace,idpgp from permiso;
> curinsert refcursor;
> my $pgp=null;
> while($row=spi_fetchrow(curselect))
> {
> FETCH curdata INTO nombre,apell,link,gpg;
> @apellidos=split(/ /,apell);
> $pgp=(!defined gpg)?'NULL':pgp;
> OPEN curinsert FOR EXECUTE "INSERT INTO posgrado.personal(nombre,apellidop,apellidom,cargo,idpgp,enlaceins) VALUES('nombre','$apellidos[0]','$apellidos[1]','link','$pgp')";
> CLOSE curinsert;
> }
> CLOSE curselect;
> return undef;
> $$ LANGUAGE plperl;

En plperl no es necesario usar cursores de esa forma. Puedes usar
spi_query() y spi_fetchrow(). Creo que tu ejemplo seria algo mas o
menos como esto

CREATE OR REPLACE FUNCTION apellidos() RETURNS text AS $$
my $foo = spi_query(" select nombrec,apel,cargo,enlace,idpgp from permiso");
while (defined $row = spi_fetchrow($foo)) {
spi_exec_query("insert into ... ");
}

$$;

Pero lo peor es que tu ejemplo no tiene sentido hacerlo con una funcion.
Puedes hacer

insert into posgrado.personal (nombre, apellidop, apellidom, ...)
select nombrec, split_part(apel, ' ', 1), split_part(apel, ' ', 2), ...
from permiso;

y los inserta todos de una sola vez.

Asi que si tu funcion resulta ser muy lenta, no te quejes! Ya sabes
como se hace rapido.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Marcos Garrido 2007-07-04 20:32:17 Re: Ide tipo TOAD.
Previous Message manuel lamas 2007-07-04 20:08:22 Re: postgresql.conf y autovacuum