Esta construcción no es posible:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
Se puede simplificar a:
IF EXISTS (SELECT 1 FROM mytable) THEN ...
Sin embargo, su ejemplo es probablemente sólo simplificado. Para SQL dinámico ejecutado con EXECUTE
, read the manual here. Puede comprobar si hay FOUND
después RETURN QUERY EXECUTE
:
IF FOUND THEN ...
Sin embargo:
nota en particular que EXECUTE
cambia la salida de GET DIAGNOSTICS
, pero no cambia FOUND
.
Bold emphasis mine. Para una llanura EXECUTE
hacer esto en su lugar:
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable';
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
O si oportuno - en particular, con sólo los resultados de una sola fila - utilizar el INTO
clause con EXECUTE
para obtener un resultado de la consulta dinámica directamente. Cito el manual here:
Si se proporciona una fila o una lista de variables, que debe coincidir exactamente con la estructura de los resultados de la consulta (cuando se utiliza una variable de registro, se configurará para que coincida con la estructura de resultados automáticamente). Si se devuelven varias filas , solo la primera se asignará a la variable INTO
. Si no se devuelve ninguna fila, NULL se asigna a la variable INTO
.
...
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 ...
Te has extraviado con respecto a 'FOUND'. No está establecido por un simple EJECUTAR. Ver mi respuesta para más detalles. –
Ja, eso es lo que recibo por responder rápidamente. –