Questo costrutto non è possibile:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
Puoi semplificare in:
IF EXISTS (SELECT 1 FROM mytable) THEN ...
Ma il tuo esempio è probabilmente semplificato. Per SQL dinamico eseguito con EXECUTE
, leggi il manuale qui. Puoi controllare la variabile speciale FOUND
immediatamente dopo l'esecuzione di qualsiasi comando DML per vedere se le righe qui presenti sono interessate:
IF FOUND THEN ...
Tuttavia:
Nota in particolare che EXECUTE
cambia l'output di GET DIAGNOSTICS
, ma non cambia FOUND
.
Enfasi in grassetto mio. Per un semplice EXECUTE
fai questo invece:
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable'; -- something dynamic here
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
Oppure se opportuno, in particolare con risultati a riga singola, utilizzare il INTO
clausola con EXECUTE
per ottenere direttamente un risultato dalla query dinamica. Cito il manuale qui:
Se viene fornita una riga o un elenco di variabili, deve corrispondere esattamente alla struttura dei risultati della query (quando viene utilizzata una variabile di record, si configurerà automaticamente per corrispondere alla struttura dei risultati). Se vengono restituite più righe, solo la prima verrà assegnata a INTO
variabile. Se non vengono restituite righe, NULL viene assegnato a INTO
variabile/i.
...
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 ...