Dieses Konstrukt ist nicht möglich:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
Sie können vereinfachen zu:
IF EXISTS (SELECT 1 FROM mytable) THEN ...
Aber Ihr Beispiel ist wahrscheinlich vereinfacht. Für dynamisches SQL mit EXECUTE
ausgeführt , lesen Sie das Handbuch hier. Sie können die spezielle Variable FOUND
prüfen unmittelbar nach der Ausführung eines DML-Befehls, um zu sehen, ob hier Zeilen betroffen sind:
IF FOUND THEN ...
Allerdings:
Beachten Sie insbesondere, dass EXECUTE
ändert die Ausgabe von GET DIAGNOSTICS
, ändert aber FOUND
nicht .
Fette Hervorhebung von mir. Für ein einfaches EXECUTE
tun Sie dies stattdessen:
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable'; -- something dynamic here
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
Oder Verwenden Sie gegebenenfalls - insbesondere bei nur einzeiligen Ergebnissen - den INTO
-Klausel mit EXECUTE
um direkt ein Ergebnis aus der dynamischen Abfrage zu erhalten. Ich zitiere das Handbuch hier:
Wenn eine Zeilen- oder Variablenliste bereitgestellt wird, muss sie genau mit der Struktur der Ergebnisse der Abfrage übereinstimmen (wenn eine Datensatzvariable verwendet wird, konfiguriert sie sich automatisch so, dass sie der Ergebnisstruktur entspricht). Wenn mehrere Zeilen zurückgegeben werden, wird nur die erste dem INTO
zugewiesen Variable. Wenn keine Zeilen zurückgegeben werden, wird dem INTO
NULL zugewiesen Variable(n).
...
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 ...