create function test(a integer, b integer)
returns table (a integer, b integer) as $$
begin
return query select 1, 2;
end;
$$ language plpgsql;
lança exceção:
ERROR: parameter name "a" used more than once
CONTEXT: compilation of PL/pgSQL function "test" near line 1
Porque isso está acontecendo? Achei que o nome do argumento da função não tem nada a ver com o nome da coluna da tabela retornada. Existe uma solução alternativa para ter o argumento da função chamado "a" e também ter a coluna chamada "a" em uma tabela retornada da função?
Eu sei que posso retornar setof record
, mas tenho que "definir" explicitamente as colunas retornadas da função na consulta selecionada:
create function test(a integer, b integer)
returns setof record as $$
begin
return query select 1, 2;
end;
$$ language plpgsql;
select * from test(1, 2) as (a integer, b integer)
Você definiu uma variável de entrada e uma variável de retorno com o mesmo nome, então ela não pode ser desambiguada pelo PL/PGSQL, como a mensagem de erro está informando.
Você também pode alterá-lo para
returns table (c integer, d integer)
, ou pode criar um tipo para isso, comoCREATE TYPE mytype (a integer, b integer)
e, em seguida, usá-lo em sua função comoreturns setof mytype
, o que deve fornecer o comportamento que você está procurando, sem variáveis de colisão.