PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Dynamisches SQL (EXECUTE) als Bedingung für IF-Anweisung

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