Deze constructie is niet mogelijk:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
U kunt vereenvoudigen tot:
IF EXISTS (SELECT 1 FROM mytable) THEN ...
Maar uw voorbeeld is waarschijnlijk vereenvoudigd. Voor dynamische SQL uitgevoerd met EXECUTE
, lees hier de handleiding. U kunt de speciale variabele FOUND
. controleren onmiddellijk na het uitvoeren van een DML-opdracht om te zien of er rijen zijn die hier invloed op hebben:
IF FOUND THEN ...
Maar:
Merk in het bijzonder op dat
EXECUTE
verandert de uitvoer vanGET DIAGNOSTICS
, maar verandert nietFOUND
.
Vetgedrukte nadruk van mij. Voor een eenvoudige EXECUTE
doe dit in plaats daarvan:
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable'; -- something dynamic here
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
Of indien opportuun - in het bijzonder met alleen resultaten van één rij - gebruik de INTO
clausule met EXECUTE
om direct een resultaat van de dynamische query te krijgen. Ik citeer hier de handleiding:
Als er een rij- of variabelenlijst wordt gegeven, moet deze exact overeenkomen met de structuur van de resultaten van de query (wanneer een recordvariabele wordt gebruikt, zal deze zichzelf configureren om automatisch overeen te komen met de resultaatstructuur). Als er meerdere rijen worden geretourneerd, wordt alleen de eerste toegewezen aan de
INTO
variabel. Als er geen rijen worden geretourneerd, wordt NULL toegewezen aan deINTO
variabele(n).
...
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 ...