Esta construção não é possível:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
Você pode simplificar para:
IF EXISTS (SELECT 1 FROM mytable) THEN ...
Mas seu exemplo provavelmente é simplificado. Para SQL dinâmico executado com
EXECUTE
, leia o manual aqui. Você pode verificar a variável especial FOUND
imediatamente após executar qualquer comando DML para ver se alguma linha aqui foi afetada:IF FOUND THEN ...
No entanto:
Observe em particular queEXECUTE
altera a saída deGET DIAGNOSTICS
, mas não alteraFOUND
.
Minha ênfase em negrito. Para um
EXECUTE
simples faça isso em vez disso:...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable'; -- something dynamic here
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
Ou se for oportuno - em particular com apenas resultados de linha única - use o
INTO
cláusula com EXECUTE
para obter um resultado da consulta dinâmica diretamente. Cito o manual aqui:
Se uma linha ou lista de variáveis for fornecida, ela deve corresponder exatamente à estrutura dos resultados da consulta (quando uma variável de registro for usada, ela se configurará para corresponder à estrutura do resultado automaticamente). Se várias linhas forem retornadas, apenas a primeira será atribuída aoINTO
variável. Se nenhuma linha for retornada, NULL será atribuído aoINTO
variável(eis).
...
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 ...