Тази конструкция не е възможна:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
Можете да опростите до:
IF EXISTS (SELECT 1 FROM mytable) THEN ...
Но вашият пример вероятно е опростен. Задинамичен SQL изпълнява се с EXECUTE , прочетете ръководството тук. Можете да проверите специалната променлива FOUND веднага след изпълнение на която и да е DML команда, за да видите дали някои редове тук са засегнати:
IF FOUND THEN ...
Въпреки това:
Забележете по-специално, че
EXECUTEпроменя изхода наGET DIAGNOSTICS, но не променяFOUND.
Удебелен акцент мой. За обикновен EXECUTE направете това вместо това:
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable'; -- something dynamic here
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
Или ако е подходящо - по-специално с резултати само от един ред - използвайте INTO клауза с EXECUTE за да получите директно резултат от динамичната заявка. Цитирам ръководството тук:
Ако е предоставен списък с редове или променливи, той трябва да съвпада точно със структурата на резултатите от заявката (когато се използва променлива на запис, тя ще се конфигурира да съответства автоматично на структурата на резултата). Ако бъдат върнати няколко реда, само първият ще бъде присвоен на
INTOпроменлива. Ако не бъдат върнати редове, наINTOсе присвоява NULL променлива(и).
...
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 ...