PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Erreur lors de la définition de n_distinct à l'aide d'une variable plpgsql

C'est par conception. Le manuel explique dans le chapitre Substitution de variables :

La substitution de variables ne fonctionne actuellement que dans SELECT , INSERT , UPDATE ,et DELETE commandes, car le moteur SQL principal n'autorise les paramètres de requête que dans ces commandes. Pour utiliser un nom ou une valeur non constant dans d'autres types d'instructions (généralement appelées instructions d'utilitaire), vous devez construire l'instruction d'utilitaire sous forme de chaîne et EXECUTE il.

Vous ne pouvez pas paramétrer la valeur dans une instruction dynamique avec EXECUTE soit parce que, citant le chapitre Exécuter des commandes dynamiques :

Une autre restriction sur les symboles de paramètre est qu'ils ne fonctionnent que dans SELECT , INSERT , UPDATE , et DELETE commandes. Dans d'autres types d'instructions (généralement appelées instructions d'utilité), vous devez insérer des valeurs textuellement même s'il ne s'agit que de valeurs de données.

La seule option dans une fonction plpgsql consiste à concaténer la valeur dans la chaîne de commande. Vous pouvez utiliser format() , mais pour l'exemple simple, la concaténation simple est sûre et 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 qualification de schéma pg_temp. en fait une fonction "temporaire" (non documentée !), reflétant la question.
Le manuel sur n_distinct .