Detta är designat. Handboken förklarar i kapitlet Variabelsubstitution :
Variabelsubstitution fungerar för närvarande endast i
SELECT,INSERT,UPDATEochDELETEkommandon, eftersom den huvudsakliga SQL-motorn tillåter frågeparametrar endast i dessa kommandon. För att använda ett icke-konstant namn eller värde i andra programsatser (allmänt kallade verktygssatser), måste du konstruera verktygssatsen som en sträng ochEXECUTEdet.
Du kan inte parametrisera värdet i en dynamisk sats med EXECUTE antingen för att, citerar kapitlet Utföra dynamiska kommandon :
En annan begränsning för parametersymboler är att de bara fungerar i
SELECT,INSERT,UPDATEochDELETEkommandon. I andra programsatser (allmänt kallade verktygssatser) måste du infoga värden textuellt även om de bara är datavärden.
Det enda alternativet i en plpgsql-funktion är att sammanfoga värdet i kommandosträngen. Du kan använda format() , men för det enkla exemplet är vanlig sammanlänkning säker och enkel::
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
$$;
Schema-kvalifikationen pg_temp. gör det till en (odokumenterad!) "tillfällig" funktion, vilket speglar frågan.
Manualen om n_distinct .