Optionales argument, das 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
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
für, die.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:
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.
CREATE OR REPLACE FUNCTION foofunc(int, date, date, VARIADIC ARRAY[]::integer[])
? und überlast die Funktion mit einem wrapper für eine leere Liste (ich denke, das ist, was Sie sagen). Nun, in Bezug auf die übergabe einer Liste von ids, wie kann ich das übergeben eine Liste von ids zu foofunc() - bitte beachten Sie die beiseite unten meine Frage.ARRAY[]::
, einfach akzeptierenvariable_name VARIADIC integer[]
.Du meinst SQL-Funktionen mit Variabler Anzahl von Argumenten? Wenn dem so ist, verwenden Sie VARIADIC.
VARIADIC
verhält sich anders, was Sie möglicherweise verwendet werden, um mit varargs in einigen Sprachen. Insbesondere die null-Variable Argumente werden nicht akzeptiert. Wenn Sie möchten, um den Anruf mit null Variable Argumente, verwenden Sie die syntaxthe_varargs_function(fixedarg1, fixedarg2, VARIADIC ARRAY[]::argtype[])
woargtype[]
ist der Typ der Variable array-argument. Es ist oft hilfreich sein, schreiben einen einfachenLANGUAGE SQL
wrapper-Funktion, die einen null-argument-form.param1, param2
etc wird immer vorhanden sein.