Denna konstruktion är inte möjlig:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
Du kan förenkla till:
IF EXISTS (SELECT 1 FROM mytable) THEN ...
Men ditt exempel är förmodligen förenklat. För dynamisk SQL körs med EXECUTE
, läs manualen här. Du kan kontrollera den speciella variabeln FOUND
omedelbart efter att ha utfört ett DML-kommando för att se om några rader här påverkade:
IF FOUND THEN ...
Men:
Observera särskilt att
EXECUTE
ändrar utdata förGET DIAGNOSTICS
, men ändrar inteFOUND
.
Djärv betoning min. För en vanlig EXECUTE
gör så här istället:
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable'; -- something dynamic here
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
Eller om det är lämpligt - särskilt med endast enradsresultat - använd INTO
sats med EXECUTE
för att få ett resultat från den dynamiska frågan direkt. Jag citerar manualen här:
Om en rad eller variabellista tillhandahålls måste den exakt matcha strukturen för sökfrågans resultat (när en postvariabel används konfigurerar den sig själv att matcha resultatstrukturen automatiskt). Om flera rader returneras kommer endast den första att tilldelas
INTO
variabel. Om inga rader returneras tilldelas NULL tillINTO
variabel(er).
...
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 ...