RE: Consultas varias

Lists: pgsql-es-ayuda
From: Alvaro Herrera <alvherre(at)dcc(dot)uchile(dot)cl>
To: Esteban Osorio <eosorio(at)economia(dot)cl>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consultas varias
Date: 2004-12-16 15:46:13
Message-ID: 20041216154612.GB25834@dcc.uchile.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On Thu, Dec 16, 2004 at 12:43:48PM -0400, Esteban Osorio wrote:

Hola,

> En la instrucción de invocación a la función, ¿que significa la
> parte "as foo (a int, b text)"?

Es un alias que define el tipo de retorno de la funcion. Puedes cambiar
foo, a y b por nombres cualquiera, pero tienes que indicarle los tipos
de datos correctos. (De lo contrario lanzara un error al momento de
ejecutar la funcion).

Una alternativa es definir un tipo de dato especial y declarar la
funcion como retornando SETOF ese tipo en lugar de SETOF RECORD. Asi
puedes omitir el alias.

CREATE TYPE foo AS (a int, b text);
CREATE FUNCTION foo() RETURNS SETOF foo ...;
SELECT * FROM foo();

--
Alvaro Herrera (<alvherre[(at)]dcc(dot)uchile(dot)cl>)
Este mail se entrega garantizadamente 100% libre de sarcasmo.


From: Esteban Osorio <eosorio(at)economia(dot)cl>
To: Alvaro Herrera <alvherre(at)dcc(dot)uchile(dot)cl>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: RE: Consultas varias
Date: 2004-12-16 16:43:48
Message-ID: 50FBA0B402D8D6118EEC0080C8F8BA33022D83C8@KEYNES
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Alvaro:

En la instrucción de invocación a la función, ¿que significa la
parte "as foo (a int, b text)"?

Saludos y gracia,

Esteban.

-----Mensaje original-----
De: Alvaro Herrera [mailto:alvherre(at)dcc(dot)uchile(dot)cl]
Enviado el: Jueves, 16 de Diciembre de 2004 11:06
Para: Esteban Osorio
CC: pgsql-es-ayuda(at)postgresql(dot)org
Asunto: Re: [pgsql-es-ayuda] Consultas varias

On Thu, Dec 16, 2004 at 12:03:30PM -0400, Esteban Osorio wrote:

Hola,

> CREATE FUNCTION public.busca_depcia() RETURNS refcursor AS '
> DECLARE
> cursor1 CURSOR FOR SELECT id_depcia, descripcion FROM dependencia order by
> descripcion;
> BEGIN
> OPEN cursor1;
> RETURN (cursor1);
> END;
> ' LANGUAGE 'plpgsql' VOLATILE;

Ugh ... ese truco del refcursor esta obsoleto desde Postgres 7.3. Mejor
algo como

CREATE FUNCTION public.busca_depcia() RETURNS setof record AS '
DECLARE
rec record;
begin
FOR SELECT into rec id_depcia, descripcion FROM dependencia order by
descripcion loop
return next rec;
end loop;
return;
END;
' LANGUAGE 'plpgsql' VOLATILE;

Luego lo invocas como

select public.busca_depcia() as foo (a int, b text);

--
Alvaro Herrera (<alvherre[(at)]dcc(dot)uchile(dot)cl>)
Essentially, you're proposing Kevlar shoes as a solution for the problem
that you want to walk around carrying a loaded gun aimed at your foot.
(Tom Lane)