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
,etDELETE
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 etEXECUTE
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
, etDELETE
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
.