PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Funktionen mit variabler Anzahl von Eingabeparametern

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.