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

SQL dynamique (EXECUTE) comme condition pour l'instruction IF

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 de GET DIAGNOSTICS , mais ne change pas FOUND .

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é au INTO 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 ...