PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Erro ao definir n_distinct usando uma variável plpgsql


Isso é por design. O manual explica no capítulo Substituição de variável :

A substituição de variável atualmente funciona apenas em SELECT , INSERT , UPDATE , e DELETE 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 e EXECUTE 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 em SELECT , INSERT , UPDATE e DELETE 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 .