EXECUTE ... USING
ne fonctionne qu'en PL/PgSQL - c'est-à-dire dans les fonctions ou DO
blocs écrits dans le langage PL/PgSQL. Cela ne fonctionne pas en SQL ordinaire ; le EXECUTE
en SQL brut est complètement différent, pour l'exécution d'instructions préparées. Vous ne pouvez pas utiliser SQL dynamique directement dans le dialecte SQL de PostgreSQL.
Comparez :
EXECUTE ... USING
de PL/PgSQL; àEXECUTE
de SQL
Voir le 2ème dernier par dans ma réponse précédente.
En plus de ne pas fonctionner sauf en PL/PgSQL, votre instruction SQL est erronée, elle ne fera pas ce que vous attendez. Si (select id from ids where condition = some_condition)
renvoie par exemple 42
, l'instruction échouerait si id
est un entier. S'il est converti en texte, vous obtiendrez :
EXECUTE format('SELECT * from result_%s_table', quote_ident('42'));
EXECUTE format('SELECT * from result_%s_table', '"42"');
EXECUTE 'SELECT * from result_"42"_table';
C'est invalide. Vous voulez réellement result_42_table
ou "result_42_table"
. Vous devriez écrire quelque chose comme :
EXECUTE format('SELECT * from %s', quote_ident('result_'||(select id from ids where condition = some_condition)||'_table'))
... si vous devez utiliser quote_ident
.