Тази конструкция не е възможна:
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 ...