2011-12-09 15 views
7

Quiero ejecutar una sentencia de SQL dinámico, con su valor devuelto es el condicional para una declaración IF:SQL dinámico (EJECUTAR) como condición para la instrucción IF

IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN 

Esto genera el error ERROR: type "execute" does not exist.

¿Es posible hacer esto, o es necesario ejecutar el SQL antes de la instrucción IF en una variable, y luego verificar la variable como condicional?

Respuesta

19

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

Matt,

De la sintaxis anterior, que está escribiendo PL/pgSQL, no SQL.Por supuesto THT, hay dos maneras de hacer lo que quiere, pero ambos requieren dos líneas de código:

EXECUTE 'SELECT EXISTS (SELECT 1 FROM ' || table_variable || ');' INTO boolean_var; 

IF boolean_var THEN ... 

O:

EXECUTE 'SELECT 1 FROM ' || table_variable || ');'; 

IF FOUND THEN ... 

"que se encuentra" es una variable especial que comprueba si el la última ejecución de la consulta devolvió las filas.

+2

Te has extraviado con respecto a 'FOUND'. No está establecido por un simple EJECUTAR. Ver mi respuesta para más detalles. –

+0

Ja, eso es lo que recibo por responder rápidamente. –

-3
SET @SQLQUERY='SELECT 1 FROM mytable' 

EXEC (@SQLQUERY) 
If @@RowCount >0 THEN 
+1

Eso no es válido para Postgres –

Cuestiones relacionadas