2009/5/18 André Volpato <[email protected]>

>
> Fiz uns testes aqui e gostaria de esclarecer se é possível retornar um
> tipo realmente gernérico, sem ter que recriar a função toda hora:
>
> create or replace function retornafoo ()
> returns setof record as
> $body$
>    declare
>        saida    record;
>    begin
>        for saida in
>        select 1::integer as foo,
>            'andre'::text as nome ,
>            now()::date as hoje
>        loop
>            return next saida;
>        end loop;
>    end;
> $body$
> language 'plpgsql';
>
> Dessa maneira consigo retornar os 3 campos definidos :
> select * from retornafoo() as (foo int, nome text, hoje date);
>
> Mas como eu poderia retornar, por exemplo, apenas o campo "hoje date()"?
> Ou então, se eu quisesse retornar um outro tipo de campo, eu teria que
> recriar a função?
>
> select foo from retornafoo() as (foo int);
> ERROR:  wrong record type supplied in RETURN NEXT
>
>
Amigo André,

Desculpe me intrometer no assunto, mas o caso é que uma Função que retorna
um RecordSet é como se fosse uma Relação (aka tabela) e esta permanece
inalterada ao efetuar uma recuperação dos registros.

Para o que você deseja bastaria um (se eu entendi bem):

SELECT hoje FROM refornafoo() AS (foo INTEGER, nomeTEXT, hoje DATE);


Para facilitar a vida voce poderia criar um tipo para o retorno dessa
função:

CREATE TYPE tp_foo AS (foo int, nome text, hoje date);


E logo após modificar o retorno da tua funçao pra utilizar esse tipo:

create or replace function retornafoo ()
returns setof tp_foo as
$body$
   declare
       saida    record;
   begin
       for saida in
       select 1::integer as foo,
           'andre'::text as nome ,
           now()::date as hoje
       loop
           return next saida;
       end loop;
   end;
$body$
language 'plpgsql';

Com isso vc não precisa definir o RecordSet no seu Select, fazendo somente:

SELECT foo FROM retornafoo();

ou

SELECT hoje FROM retornafoo();


Cordialmente,

-- 
Fabrízio de Royes Mello
>> Blog sobre PostgreSQL: http://fabriziomello.blogspot.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a