Dette er ved design. Manualen forklarer i kapitlet Variabel substitution :
Variabel substitution fungerer i øjeblikket kun i SELECT , INSERT , UPDATE og DELETE kommandoer, fordi den primære SQL-motor kun tillader forespørgselsparametre i disse kommandoer. For at bruge et ikke-konstant navn eller værdi i andre sætningstyper (generisk kaldet utility-sætninger), skal du konstruere utility-sætningen som en streng og EXECUTE det.
Du kan ikke parametriser værdien i en dynamisk sætning med EXECUTE enten fordi, citerer kapitlet Udførelse af dynamiske kommandoer :
En anden begrænsning for parametersymboler er, at de kun virker i SELECT , INSERT , UPDATE og DELETE kommandoer. I andre sætningstyper (generelt kaldet utility statements), skal du indsætte værdier tekstuelt, selvom de kun er dataværdier.
Den eneste mulighed i en plpgsql-funktion er at sammenkæde værdien i kommandostrengen. Du kan bruge format() , men for det simple eksempel er almindelig sammenkædning sikker og nem::
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
$$;
Skema-kvalifikationen pg_temp. gør det til en (udokumenteret!) "midlertidig" funktion, hvilket afspejler spørgsmålet.
Manualen om n_distinct .