PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Errore durante l'impostazione di n_distinct utilizzando una variabile plpgsql

Questo è di progettazione. Il manuale spiega nel capitolo Sostituzione di variabili :

La sostituzione delle variabili attualmente funziona solo in SELECT , INSERT , UPDATE , e DELETE comandi, perché il motore SQL principale consente queryparameters solo in questi comandi. Per utilizzare un nome o un valore non costante in altri tipi di istruzione (generalmente chiamati istruzioni di utilità), devi costruire l'istruzione di utilità come una stringa e EXECUTE esso.

non puoi parametrizzare il valore in un'istruzione dinamica con EXECUTE sia perché, citando il capitolo Esecuzione dei comandi dinamici :

Un'altra restrizione sui simboli dei parametri è che funzionano solo in SELECT , INSERT , UPDATE e DELETE comandi. In altri tipi di istruzioni (generalmente chiamate istruzioni di utilità), devi inserire valori testualmente anche se sono solo valori di dati.

L'unica opzione in una funzione plpgsql consiste nel concatenare il valore nella stringa di comando. Potresti usare format() , ma per il semplice esempio, la semplice concatenazione è sicura e facile::

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
$$;

La qualifica dello schema pg_temp. lo rende una funzione "temporanea" (non documentata!), rispecchiando la domanda.
Il manuale su n_distinct .