Optionales Argument in PL / pgSQL-Funktion
Ich bin versucht zu schreiben Sie eine PL/pgSQL-Funktion mit optionalen Argumenten. Es führt eine Abfrage basierend auf einer gefilterten Gruppe von Datensätzen (falls angegeben), sonst führt eine Abfrage auf die gesamten Daten in einer Tabelle.
Beispielsweise (PSEUDO-CODE):
CREATE OR REPLACE FUNCTION foofunc(param1 integer, param2 date, param2 date, optional_list_of_ids=[]) RETURNS SETOF RECORD AS $$
IF len(optional_list_of_ids) > 0 THEN
RETURN QUERY (SELECT * from foobar where f1=param1 AND f2=param2 AND id in optional_list_of_ids);
ELSE
RETURN QUERY (SELECT * from foobar where f1=param1 AND f2=param2);
ENDIF
$$ LANGUAGE SQL;
Was wäre der richtige Weg, um diese Aufgabe umzusetzen?
Als ein beiseite, ich würde gerne wissen, wie ich könnte so eine Funktion in einer anderen äußeren Funktion. Dies ist, wie ich es tun würde - ist es richtig, oder gibt es eine bessere Möglichkeit?
CREATE FUNCTION foofuncwrapper(param1 integer, param2 date, param2 date) RETURNS SETOF RECORD AS $$
BEGIN
CREATE TABLE ids AS SELECT id from foobar where id < 100;
RETURN QUERY (SELECT * FROM foofunc(param1, param2, ids));
END
$$ LANGUAGE SQL
InformationsquelleAutor der Frage Homunculus Reticulli | 2012-07-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seit PostgreSQL 8.4 (was Sie zu sein scheinen, laufen), es gibt default-Werte für Funktions-Parameter. Wenn Sie die parameter der letzten und der eine Standardeinstellung, können Sie einfach weglassen, es aus dem Aufruf:
Wichtigsten Punkte:
Dem Stichwort
DEFAULT
wird verwendet, um zu deklarieren parameter ist der Standardwert. Kurze alternative:=
.Habe ich entfernt redundante
param1
von der unordentlichen Beispiel.Seit Sie zurück
SELECT * FROM foobar
deklarieren des Rückgabetyps alsRETURNS SETOF foobar
stattRETURNS SETOF record
. Die letztere form mit anonymisierter Datensätze ist sehr unhandlich, Sie müssten, um eine definition für die Spalte Liste bei jedem Aufruf.Benutze ich ein array of integer (
int[]
) als Funktion der parameter. AngepasstIF
Ausdruck und dieWHERE
- Klausel entsprechend.IF
- Anweisungen sind nicht verfügbar in plain SQL. HatLANGUAGE plpgsql
.Anruf mit oder ohne
_ids
:Effektiv das gleiche:
Müssen Sie sicherstellen, dass der Aufruf ist eindeutig. Wenn Sie eine andere Funktion mit dem gleichen Namen und mit zwei Parametern, Postgres kann nicht wissen, welche zu wählen. Die explizite Umwandlung (wie ich zeige) verengt es nach unten. Andere, nicht typisierten string-Literale, arbeiten zu müssen, aber als explizite schadet nie.
Aufruf innerhalb einer anderen Funktion:
InformationsquelleAutor der Antwort Erwin Brandstetter
Erarbeiten Frank's Antwort auf diesen thread:
Den
VARIADIC
agument nicht das einzige argument, nur der Letzte.Können Sie
VARIADIC
für Funktionen, die möglicherweise nehmen null Variable Argumente, es ist nur ein wenig fiddlier, erfordert eine andere aufrufen Stil für null, args. Sie können eine wrapper-Funktion zum ausblenden der Hässlichkeit. Aufgrund einer ersten varardic definition einer Funktion wie:Null args benutzen einen wrapper wie:
oder rufen Sie die main-Funktion mit einem leeren array wie
VARIADIC '{}'::integer[]
direkt. Die Hülle ist hässlich, aber es ist enthalten Hässlichkeit, so würde ich empfehlen einen wrapper.Direkte Anrufe können gemacht werden, Variable form:
... oder array-call-Formular mit array-ctor:
... oder array-literalen text form:
Letztere zwei Formen funktionieren mit leeren arrays.
InformationsquelleAutor der Antwort Craig Ringer
Du meinst SQL-Funktionen mit Variabler Anzahl von Argumenten? Wenn dem so ist, verwenden Sie VARIADIC.
InformationsquelleAutor der Antwort Frank Heikens