sql >> Base de Datos >  >> RDS >> PostgreSQL

SQL dinámico (EXECUTE) como condición para la declaración IF

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 ...