sql >> Databasteknik >  >> RDS >> PostgreSQL

Funktioner med variabelt antal ingångsparametrar

Avancerade funktioner som VARIADIC eller till och med polymorfa indatatyper och dynamisk SQL är mycket kraftfulla. Det sista kapitlet i det här svaret ger ett avancerat exempel:

  • Refaktorera en PL/pgSQL-funktion för att returnera utdata från olika SELECT-frågor

Men för ett enkelt fall som ditt kan du bara använda standardvärden för funktionsparametrar. Allt beror på exakta krav.
Om kolumnerna i fråga är alla definierade NOT NULL , detta skulle förmodligen vara enklare och snabbare:

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;

Läs om standardvärden i manualen!

För att undvika namnkonflikter mellan parametrar och kolumnnamn gör jag det till en vana att prefixa indataparametrar med __ . Det är en fråga om smak och stil.

  • Den första parametern name har ingen standard, eftersom det alltid krävs.
  • Andra parametrar kan utelämnas.
  • Minst en krävs, eller en VARNING höjs och inget annat händer.
  • UPPDATERING kommer bara att ändra kolumner för givna parametrar.
  • Kan enkelt utökas för N parametrar.

Funktionsanrop

Sedan Postgres 9.5 :

Det enkla sättet är med positionsbeteckning för parametrar. Detta tillåter bara att utelämna parametern/parametrarna längst till höger:

SELECT update_site('foo', 'New York');  -- no telephone

Namngiven notation tillåter att utelämna alla parameter som har ett standardvärde:

SELECT update_site(name => 'foo', _telephone => 123);  -- no city

Båda kan kombineras i blandad notation :

SELECT update_site('foo', _telephone => 123);  -- still no city

I Postgres 9.4 eller äldre, := användes för tilldelning i samtalet:

SELECT update_site(name := 'foo', _telephone := 123);
SELECT update_site('foo', _telephone := 123);

Fortfarande giltigt i Postgres 12 för bakåtkompatibilitet, men använd hellre den moderna notationen.



  1. Hur man lägger till dagar till ett datum i MySQL

  2. Postgres-kolumnen finns inte

  3. SQL Server AlwaysOn Availability Groups:Installation och konfiguration, del 1

  4. Öka automatiskt efter borttagning i MySQL