Erweiterte Funktionen wie VARIADIC
oder sogar polymorphe Eingabetypen und dynamisches SQL sind sehr leistungsfähig. Das letzte Kapitel in dieser Antwort enthält ein erweitertes Beispiel:
- Refaktorisieren Sie eine PL/pgSQL-Funktion, um die Ausgabe verschiedener SELECT-Abfragen zurückzugeben
Aber für einen einfachen Fall wie Ihren können Sie einfach Standardwerte verwenden für Funktionsparameter. Es hängt alles von den genauen Anforderungen ab.
Wenn die fraglichen Spalten sind alle definiert NOT NULL
, das wäre wahrscheinlich einfacher und schneller:
CREATE OR REPLACE FUNCTION update_site(_name text -- always required
, _city text DEFAULT NULL
, _telephone integer DEFAULT NULL)
RETURNS integer AS
$func$
BEGIN
IF _city IS NULL AND _telephone IS NULL THEN
RAISE WARNING 'At least one value to update required!';
RETURN; -- nothing to update
END IF;
UPDATE "Sites"
SET "City" = COALESCE(_city, "City")
, "Telephone" = COALESCE(_telephone, "Telephone")
WHERE "SiteName" = _name;
END
$func$ LANGUAGE plpgsql;
Lesen Sie mehr über die Standardwerte im Handbuch!
Um Namenskonflikte zwischen Parametern und Spaltennamen zu vermeiden, mache ich es mir zur Gewohnheit, Eingabeparametern _
voranzustellen . Das ist Geschmacks- und Stilsache.
- Der erste Parameter
name
hat keinen Standardwert, da er immer erforderlich ist. - Andere Parameter können weggelassen werden.
- Mindestens einer ist erforderlich oder eine
WARNING
ausgelöst wird und nichts weiter passiert. - Das
UPDATE
ändert nur Spalten für gegebene Parameter. - Kann einfach um N erweitert werden Parameter.
Funktionsaufruf
Seit Postgres 9.5 :
Der einfache Weg ist mit Positionsnotation für Parameter. Dies erlaubt nur das Weglassen des/der Parameter ganz rechts:
SELECT update_site('foo', 'New York'); -- no telephone
Benannte Notation erlaubt das Weglassen von beliebigen Parameter, der einen Standardwert hat:
SELECT update_site(name => 'foo', _telephone => 123); -- no city
Beide können in gemischter Notation kombiniert werden :
SELECT update_site('foo', _telephone => 123); -- still no city
In Postgres 9.4 oder älter, :=
wurde für die Zuweisung im Aufruf verwendet:
SELECT update_site(name := 'foo', _telephone := 123);
SELECT update_site('foo', _telephone := 123);
In Postgres 12 aus Gründen der Abwärtskompatibilität immer noch gültig, aber verwenden Sie lieber die moderne Notation.