Dies ist beabsichtigt. Das Handbuch erklärt im Kapitel Variablensubstitution :
Die Variablenersetzung funktioniert derzeit nur in SELECT
, INSERT
, UPDATE
, und DELETE
Befehle, da die Haupt-SQL-Engine Abfrageparameter nur in diesen Befehlen zulässt. Um einen nicht konstanten Namen oder Wert in anderen Anweisungstypen (allgemein als Utility-Anweisungen bezeichnet) zu verwenden, müssen Sie die Utility-Anweisung als Zeichenfolge und EXECUTE
konstruieren es.
Das können Sie nicht parametrieren Sie den Wert in einer dynamischen Anweisung mit EXECUTE
entweder weil, das Kapitel Dynamische Befehle ausführen zitieren :
Eine weitere Einschränkung für Parametersymbole besteht darin, dass sie nur in SELECT
funktionieren , INSERT
, UPDATE
, und DELETE
Befehle. In anderen Anweisungstypen (allgemein als Utility-Anweisungen bezeichnet) müssen Sie Werte textuell einfügen, auch wenn es sich nur um Datenwerte handelt.
Die einzige Option in einer plpgsql-Funktion besteht darin, den Wert mit der Befehlszeichenfolge zu verketten. Sie können format()
verwenden , aber für das einfache Beispiel ist eine einfache Verkettung sicher und einfach::
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
$$;
Die Schemaqualifikation pg_temp.
macht es zu einer (undokumentierten!) "temporären" Funktion, die die Frage widerspiegelt.
Das Handbuch zu n_distinct
.