Cette construction n'est pas possible :
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
Vous pouvez simplifier :
IF EXISTS (SELECT 1 FROM mytable) THEN ...
Mais votre exemple est probablement simplifié. Pour SQL dynamique exécuté avec EXECUTE
, lisez le manuel ici. Vous pouvez vérifier la variable spéciale FOUND
immédiatement après l'exécution d'une commande DML pour voir si des lignes sont affectées :
IF FOUND THEN ...
Cependant :
Notez en particulier que
EXECUTE
modifie la sortie deGET DIAGNOSTICS
, mais ne change pasFOUND
.
Bold emphase mienne. Pour un simple EXECUTE
faites ceci à la place :
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable'; -- something dynamic here
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
Ou si opportun - en particulier avec des résultats à une seule ligne - utilisez le INTO
clause avec EXECUTE
pour obtenir directement un résultat de la requête dynamique. Je cite le manuel ici :
Si une ligne ou une liste de variables est fournie, elle doit correspondre exactement à la structure des résultats de la requête (lorsqu'une variable d'enregistrement est utilisée, elle se configurera automatiquement pour correspondre à la structure des résultats). Si plusieurs lignes sont renvoyées, seule la première sera affectée au
INTO
variable. Si aucune ligne n'est renvoyée, NULL est affecté auINTO
variable(s).
...
DECLARE
_var1 int; -- init value is NULL unless instructed otherwise
BEGIN
EXECUTE format('SELECT var1 FROM %I WHERE x=y LIMIT 1', 'my_Table')
INTO _var1;
IF _var1 IS NOT NULL THEN ...