Isso é por design. O manual explica no capítulo Substituição de variável :
A substituição de variável atualmente funciona apenas emSELECT
,INSERT
,UPDATE
, eDELETE
comandos, porque o mecanismo SQL principal permite parâmetros de consulta apenas nesses comandos. Para usar um nome ou valor não constante em outros tipos de instrução (genericamente chamados de instruções de utilitário), você deve construir a instrução de utilitário como uma string eEXECUTE
isto.
Você não pode parametrize o valor em uma instrução dinâmica com
EXECUTE
seja porque, citando o capítulo Executando Comandos Dinâmicos :
Outra restrição aos símbolos de parâmetro é que eles só funcionam emSELECT
,INSERT
,UPDATE
eDELETE
comandos. Em outros tipos de instrução (genericamente chamados de instruções de utilidade), você deve inserir valores textualmente, mesmo que sejam apenas valores de dados.
A única opção em uma função plpgsql é concatenar o valor na string de comando. Você pode usar
format()
, mas para o exemplo simples, a concatenação simples é segura e fácil::CREATE OR REPLACE FUNCTION pg_temp.setdistinct(_cnt real)
RETURNS void
LANGUAGE plpgsql AS
$$
BEGIN
EXECUTE 'ALTER TABLE _temp ALTER COLUMN id SET (n_distinct=' || _cnt || ')';
END
$$;
A qualificação de esquema
pg_temp.
torna uma função "temporária" (não documentada!), espelhando a pergunta.O manual sobre
n_distinct
.