PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Fehler beim Festlegen von n_distinct mithilfe einer plpgsql-Variablen

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 .