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.
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 |