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
.