sql >> Database teknologi >  >> RDS >> PostgreSQL

Funktioner med variabelt antal inputparametre

Avancerede funktioner såsom VARIADIC eller endda polymorfe inputtyper og dynamisk SQL er meget kraftfulde. Det sidste kapitel i dette svar giver et avanceret eksempel:

  • Refaktorer en PL/pgSQL-funktion for at returnere output fra forskellige SELECT-forespørgsler

Men for en simpel sag som din kan du bare bruge standardværdier for funktionsparametre. Det hele afhænger af nøjagtige krav.
Hvis de pågældende kolonner er alle defineret IKKE NULL , dette ville sandsynligvis være enklere og hurtigere:

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ærdier i manualen!

For at undgå navnekonflikter mellem parametre og kolonnenavne gør jeg det til en vane at præfikse inputparametre med __ . Det er et spørgsmål om smag og stil.

  • Den første parameter name har ingen standard, da det er påkrævet til enhver tid.
  • Andre parametre kan udelades.
  • Der kræves mindst én eller en ADVARSEL er hævet, og intet andet sker.
  • OPDATERING vil kun ændre kolonner for givne parametre.
  • Kan nemt udvides til N parametre.

Funktionskald

Siden Postgres 9.5 :

Den enkle måde er med positionsnotation for parametre. Dette tillader kun at udelade parameteren/parametrene længst til højre:

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

Navnet notation giver mulighed for at udelade enhver parameter, der har en standardværdi:

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

Begge kan kombineres i blandet notation :

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

I Postgres 9.4 eller ældre, := blev brugt til tildeling i opkaldet:

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

Stadig gyldig i Postgres 12 for bagudkompatibilitet, men brug hellere den moderne notation.



  1. SQL VISNING

  2. Hvad er forskellen mellem bindevariabler og substitutionsvariabler (som jeg indtaster ved hjælp af &&)?

  3. Hvad er den bedste praksis for at bruge en GUID som en primær nøgle, specifikt med hensyn til ydeevne?

  4. SQL Unik begrænsning på tværs af flere tabeller