To jest zgodne z projektem. Instrukcja wyjaśnia w rozdziale Zastępowanie zmiennych :
Podstawianie zmiennych obecnie działa tylko w SELECT , INSERT , UPDATE i DELETE poleceń, ponieważ główny silnik SQL zezwala na parametry zapytań tylko w tych poleceniach. Aby użyć niestałej nazwy lub wartości w innych typach instrukcji (nazywanych ogólnie instrukcjami narzędziowymi), należy skonstruować instrukcję narzędzia jako ciąg i EXECUTE to.
nie możesz sparametryzować wartość w dynamicznej instrukcji za pomocą EXECUTE albo dlatego, cytując rozdział Wykonywanie poleceń dynamicznych :
Innym ograniczeniem symboli parametrów jest to, że działają tylko w SELECT , INSERT , UPDATE i DELETE polecenia. W innych typach instrukcji (ogólnie nazywanych instrukcjami narzędziowymi) musisz wstawić wartości w formie tekstowej, nawet jeśli są to tylko wartości danych.
jedyna opcja w funkcji plpgsql jest połączenie wartości z ciągiem poleceń. Możesz użyć format() , ale w prostym przykładzie zwykła konkatenacja jest bezpieczna i łatwa:
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
$$;
Kwalifikacja schematu pg_temp. sprawia, że jest to (nieudokumentowana!) funkcja „tymczasowa”, odzwierciedlająca pytanie.
Podręcznik o n_distinct .