Detta är designat. Handboken förklarar i kapitlet Variabelsubstitution :
Variabelsubstitution fungerar för närvarande endast i
SELECT
,INSERT
,UPDATE
ochDELETE
kommandon, 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 ochEXECUTE
det.
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
,UPDATE
ochDELETE
kommandon. 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
.