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