2014-02-27 0:02 GMT-03:00 <[email protected]>:

> Senhores, estou trabalhando em um sistema onde terei que fazer várias
> consultas em varias tabelas dependendo de condições específicas.
> Para evitar idas e vindas, pensei em fazer uma função de única linha, como
> neste exemplo:
>
> CREATE FUNCTION test_record(p1, p2, p3) RETURNS RECORD AS $$
> DECLARE
>   ret RECORD;
>   ret1 RECORD;
> BEGIN
>
>       SELECT TRUE, 1 as um, 2 as dois, 3 as tres INTO ret;
>       SELECT FALSE as boleano, 4 as quatro  INTO ret1;
>
> RETURN ret + ret1;
> END;$$ LANGUAGE plpgsql;
>
>
O seu exemplo não faz muito sentido, por favor, sempre informe melhor o que
você quer. Estou deduzindo que queiras retornar várias linhas, nesse caso o
seu exemplo deveria ser adaptado para:

CREATE FUNCTION test_record(p1, p2, p3)
RETURNS SETOF RECORD /* SETOF faz com que seja possivel retornar varias
linhas */
AS $$
DECLARE
  ret RECORD; /* Não precisa de duas variáveis, ao menos que irás cruzar os
dados */
BEGIN

      SELECT TRUE, 1 as um, 2 as dois, 3 as tres INTO ret;
      RETURN NEXT ret; /* Retorna uma linha com o valor atual de ret */
      SELECT FALSE as boleano, 4 as quatro  INTO ret;
      RETURN NEXT ret; /* Retorna a segunda linha com o valor atual de ret
*/

END;$$ LANGUAGE plpgsql;

O problema de usar SETOF RECORD é que na chamada você tem que definir os
termos:

    SELECT * FROM test_record(...) AS (b bool, um int, dois int, tres int);

O que é ruim, por isso eu recomendaria usar RETURNS TABLE ou SETOF de um
tipo definido.

Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a