sql >> Base de Datos >  >> RDS >> PostgreSQL

Error al configurar n_distinct usando una variable plpgsql

Esto es por diseño. El manual explica en el capítulo Sustitución de Variables :

La sustitución de variables actualmente solo funciona en SELECT , INSERT , UPDATE y DELETE comandos, porque el motor SQL principal permite consultar parámetros solo en estos comandos. Para usar un nombre o valor no constante en otros tipos de instrucciones (genéricamente denominadas declaraciones de utilidad), debe construir la declaración de utilidad como una cadena y EXECUTE eso.

Usted no puede parametrizar el valor en una declaración dinámica con EXECUTE ya sea porque, citando el capítulo Ejecución de comandos dinámicos :

Otra restricción en los símbolos de parámetros es que solo funcionan en SELECT , INSERT , UPDATE y DELETE comandos En otros tipos de declaraciones (genéricamente llamadas declaraciones de utilidad), debe insertar valores textualmente incluso si son solo valores de datos.

La única opción en una función plpgsql es concatenar el valor en la cadena de comando. Podrías usar format() , pero para el ejemplo simple, la concatenación simple es segura y 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
$$;

La calificación de esquema pg_temp. lo convierte en una función "temporal" (¡sin documentar!), reflejando la pregunta.
El manual sobre n_distinct .