2011-12-09 23 views
7

voglio eseguire un'istruzione SQL dinamico, con il suo valore restituito è la condizionale per un IF dichiarazione:SQL dinamico (EXECUTE) come condizione per IF

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

Questo genera l'errore ERROR: type "execute" does not exist.

È possibile eseguire questa operazione oppure è necessario eseguire SQL prima dell'istruzione IF in una variabile, quindi verificare la variabile come condizionale?

risposta

19

Questo costrutto non è possibile:

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

È possibile semplificare a:

IF EXISTS (SELECT 1 FROM mytable) THEN ... 

Ma il vostro esempio è probabilmente solo semplificato. Per SQL dinamico eseguito con EXECUTE, read the manual here. È possibile verificare la presenza di FOUND dopo RETURN QUERY EXECUTE:

IF FOUND THEN ... 

Tuttavia:

nota in particolare che EXECUTE cambia l'output di GET DIAGNOSTICS, ma non cambia FOUND.

Bold enfasi miniera. Per un normale EXECUTE fare questo, invece:

... 
DECLARE 
    i int; 
BEGIN 
    EXECUTE 'SELECT 1 FROM mytable'; 

    GET DIAGNOSTICS i = ROW_COUNT; 

    IF i > 0 THEN ... 

Oppure se opportuno - in particolare con risultati sola riga - utilizzare il INTO clause con EXECUTE per ottenere un risultato dalla query dinamica direttamente. Cito il manuale di here:

Se viene fornita una riga o una lista di variabili, che deve corrispondere esattamente al struttura del risultati della query (quando viene utilizzata una variabile record, è si configurerà in modo che corrisponda alla struttura risultato automaticamente). Se vengono restituite più righe , solo la prima sarà assegnata alla variabile INTO. Se non viene restituita alcuna riga, NULL viene assegnato alle variabili .

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

Dalla sintassi di cui sopra, si sta scrivendo PL/pgSQL, non SQL.Sul presupposto tht, ci sono due modi per fare ciò che si vuole, ma entrambi richiedono due righe di codice:

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

"FOUND" è una variabile speciale che controlla se il l'ultima esecuzione della query ha restituito tutte le righe.

+2

Ti stai sbagliando riguardo a "TROVATO". Non è impostato da un semplice ESEGUI. Vedi la mia risposta per i dettagli. –

+0

Hah, questo è quello che ottengo per rispondere rapidamente. –

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

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

Non valido per Postgres –

Problemi correlati