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
.