Ich möchte eine dynamische SQL-Anweisung ausführen, deren zurückgegebener Wert die Bedingung für eine IF
-Anweisung ist:
Dies erzeugt den Fehler ERROR: type "execute" does not exist
.
Ist es möglich, dies zu tun, oder muss das SQL vor der IF-Anweisung in eine Variable ausgeführt werden, und dann die Variable als bedingte Bedingung?
prüfen?Dieses Konstrukt ist nicht möglich:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
Sie können vereinfachen:
%Vor% Aber Ihr Beispiel ist wahrscheinlich nur vereinfacht. Für dynamisches SQL ausgeführt mit EXECUTE
, Lesen Sie das Handbuch hier . Sie können nach FOUND
nach RETURN QUERY EXECUTE
:
Allerdings:
Beachten Sie insbesondere, dass
EXECUTE
die Ausgabe vonGET DIAGNOSTICS
ändert, aber nichtFOUND
.
Kühne Betonung meiner. Für eine einfache EXECUTE
stattdessen:
Oder Wenn möglich - insbesondere bei nur einzeiligen Ergebnissen - verwenden Sie INTO
-Klausel mit EXECUTE
, um direkt von der dynamischen Abfrage ein Ergebnis zu erhalten. Ich zitiere das Handbuch hier :
%Vor%Wenn eine Zeilen- oder Variablenliste angegeben wird, muss sie genau mit der übereinstimmen Struktur der Abfrage Ergebnisse (wenn eine Datensatzvariable verwendet wird, es konfiguriert sich selbst, um die Ergebnisstruktur automatisch anzupassen). Ob Mehrere Zeilen werden zurückgegeben, nur die erste wird der
INTO
Variable. Wenn keine Zeilen zurückgegeben werden, wird NULL derINTO
zugewiesen Variable (n).
Matt,
Aus der obigen Syntax schreiben Sie PL / pgSQL, nicht SQL. Bei dieser Annahme gibt es zwei Möglichkeiten, das zu tun, was Sie wollen, aber beide benötigen zwei Codezeilen:
%Vor%Oder:
%Vor%"FOUND" ist eine spezielle Variable, die überprüft, ob der letzte Abfrage-Lauf irgendwelche Zeilen zurückgegeben hat.
Tags und Links postgresql plpgsql dynamic-sql