Eu tenho um conjunto de tabelas que compartilham os mesmos campos (alguns timestamps e nomes de usuários usados para controle de versão). Preciso criar uma função com sql dinâmico que use um table_name e um timestamp como argumentos e retorne um conjunto da mesma tabela.
A consulta que preciso é um pouco mais complicada, mas para minha dúvida o exemplo a seguir deve ser suficiente.
É assim que estou tentando criar a função:
CREATE OR REPLACE FUNCTION "vsr_versioning_at_time"(_t regclass
, _d timestamp without time zone)
RETURNS SETOF _t AS
$$
BEGIN
EXECUTE 'SELECT DISTINCT ON (gid) *
FROM '|| _t ||
'WHERE vrs_start_time <= '|| _d ||
'ORDER BY gid, vrs_start_time DESC';
END
$$
LANGUAGE plpgsql;
A criação desta função falha, pois _t
não é reconhecida pelo RETURN SETOF _t
.
Você não pode usar um nome de parâmetro (
_t
) como tipo de retorno.Em vez disso, use tipos polimórficos :
E use
RETURN QUERY EXECUTE
para realmente retornar os resultados.Ligue (importante!):
Muito mais detalhes nesta resposta relacionada em SO (último capítulo):
Refatore uma função PL/pgSQL para retornar a saída de várias consultas SELECT