plpgsql Fehler "ZURÜCK WEITER haben, kann nicht einen parameter in der Funktion mit OUT-Parametern" in der Tabelle-Rückkehr-Funktion
Ich habe eine plpgsql-Funktion in PostgreSQL 9.2, die eine Tabelle zurückgibt. Die Funktion läuft mehrere Wählt, die Rückkehr in die gleichen Spalten wie die Funktion und dann entweder gibt die Ergebnisse oder eine Ausnahme auslöst, je nachdem auf einigen Prüfungen. Der einzige Weg, ich kann sehen, dies zu tun ist mit FOR ... LOOP, aber ich kann nicht herausfinden, eine bequeme Möglichkeit der Rücksendung der Reihe.
Möchte ich etwas wie das hier tun:
CREATE OR REPLACE FUNCTION my_function()
RETURNS TABLE(column1 integer, column2 boolean, ...)
AS $BODY$
DECLARE
result_row RECORD;
BEGIN
FOR result_row IN (SELECT * FROM other_function_returning_same_columns()) LOOP
IF something_wrong_with(result_row) THEN
RAISE EXCEPTION 'Something went wrong';
END IF;
RETURN NEXT result_row;
END LOOP;
END
$BODY$ LANGUAGE plpgsql STABLE;
Dieser gibt mir eine Fehlermeldung:
FEHLER: ZURÜCK WEITER haben, kann nicht einen parameter in der Funktion mit OUT-Parametern
Ich bin mir nicht sicher, warum Postgres ist hier beschweren, weil mein code sieht viel wie das Beispiel in der Dokumentation, außer, dass meine Funktion liefert TABELLE anstelle von SETOF. Es gibt keine OUT-Parameter.
Ich es schließlich geschafft, es zu bekommen, um die Arbeit mit
RETURN QUERY SELECT result_row.column1, result_row.column2, ...;
aber mit um eine Liste der Spalten, die ganze Zeit ist hässlich und schwieriger zu pflegen. Ich bin sicher, es muss einen besseren Weg geben.
Ja, ich will eine Ausnahme geworfen, in einigen Fällen.
InformationsquelleAutor EM0 | 2012-12-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
RETURN NEXT
nur zurückgegeben, was die Parameter erklärt, die in IhremRETURNS
Klausel(column1, column2, ..)
gegenwärtig halten. Sie können keine parameter für dieses Formular.Deklarierten Parameter in
RETURNS TABLE(column1 integer, column2 boolean, ...)
effektiv die gleichen alsOUT
Parameter.Dies sollte es tun:
Einfacher mit ein registrierter Typ
Können Sie noch weiter zu vereinfachen, mit einem registrierten composite-Typ:
Oder, wenn Sie Ihre Art geschieht mit einer table-definition, die Sie bereits haben, geben, da jede Tabelle können Sie den Namen als Art-Bezeichnung in PostgreSQL. Dann vereinfachen:
Reorganisieren!
Ich bin mir ziemlich sicher, dass dies alles organisiert werden kann viel effizienter zu gestalten.
Wenn Sie integrieren die
RAISE
Befehl in Ihrer Hilfsfunktionsomething_wrong_with()
und mehr günstig name it (oder it ' s evil twin)everything_groovy()
, dann können Sie vollständig ersetzenmy_function()
mit dieser einfachen Abfrage:Integrieren
RAISE
in der Basis-Funktionother_function_returning_same_columns()
weiter zu vereinfachen (und schneller). Wenn Sie nur wollen, umRAISE EXCEPTION
in bestimmten Situationen können Sie immer fügen Sie einen parameter hinzu (Standardwert), um das Gerät an /aus.Gut, es gibt immer mehr Optionen. Hinzugefügt habe ich alternativen zu meiner Antwort.
Nochmals vielen Dank! Putting Sie die check-in eine weitere Funktion ist eine interessante Idee. Es wird nicht wirklich helfen, in diesem Fall, denn der echte code ist komplizierter als mein Beispiel, aber es gibt vielleicht andere Funktionen, wo kann ich diesen trick verwenden anstatt einer Schleife über die Ergebnisse. (Es würde hier zu arbeiten, aber das wäre komplexer als die Auflistung der Spalten.)
InformationsquelleAutor Erwin Brandstetter