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
.