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 ...
fonte
2011-12-09 17:26:13
Ti stai sbagliando riguardo a "TROVATO". Non è impostato da un semplice ESEGUI. Vedi la mia risposta per i dettagli. –
Hah, questo è quello che ottengo per rispondere rapidamente. –