Esta construcción no es posible:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
Puede simplificar a:
IF EXISTS (SELECT 1 FROM mytable) THEN ...
Pero su ejemplo probablemente esté simplificado. Para SQL dinámico ejecutado con EXECUTE
, lea el manual aquí. Puede verificar la variable especial FOUND
inmediatamente después de ejecutar cualquier comando DML para ver si alguna de las filas aquí se vio afectada:
IF FOUND THEN ...
Sin embargo:
Tenga en cuenta en particular que EXECUTE
cambia la salida de GET DIAGNOSTICS
, pero no cambia FOUND
.
Énfasis en negrita mío. Para un simple EXECUTE
haz esto en su lugar:
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable'; -- something dynamic here
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
O si es oportuno, en particular con solo resultados de una sola fila, use el INTO
cláusula con EXECUTE
para obtener un resultado de la consulta dinámica directamente. Cito el manual aquí:
Si se proporciona una fila o una lista de variables, debe coincidir exactamente con la estructura de los resultados de la consulta (cuando se utiliza una variable de registro, se configurará automáticamente para coincidir con la estructura del resultado). Si se devuelven varias filas, solo se asignará la primera a INTO
variable. Si no se devuelven filas, NULL se asigna a INTO
variable(s).
...
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 ...