Эта конструкция невозможна:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
Вы можете упростить до:
IF EXISTS (SELECT 1 FROM mytable) THEN ...
Но ваш пример, вероятно, простоупрощена.Для динамический SQL , выполненный с EXECUTE
, , прочтите руководство здесь .Вы можете проверить FOUND
после RETURN QUERY EXECUTE
:
IF FOUND THEN ...
Однако:
В частности, обратите внимание, что EXECUTE
изменяет вывод GET DIAGNOSTICS
, но не меняется FOUND
.
Жирный акцент мой.Для простого EXECUTE
сделайте это вместо:
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable';
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 ...