sql >> Database >  >> RDS >> PostgreSQL

Functies met variabel aantal invoerparameters

Geavanceerde functies zoals VARIADIC of zelfs polymorfe invoertypen en dynamische SQL zijn zeer krachtig. Het laatste hoofdstuk in dit antwoord geeft een geavanceerd voorbeeld:

  • Refactor een PL/pgSQL-functie om de uitvoer van verschillende SELECT-query's te retourneren

Maar voor een eenvoudig geval als het uwe, kunt u gewoon standaardwaarden gebruiken voor functieparameters. Het hangt allemaal af van de exacte vereisten.
Als de kolommen in kwestie zijn allemaal gedefinieerd NOT NULL , zou dit waarschijnlijk eenvoudiger en sneller zijn:

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;

Lees over standaardwaarden in de handleiding!

Om naamgevingsconflicten tussen parameters en kolomnamen te voorkomen, maak ik er een gewoonte van om invoerparameters vooraf te laten gaan door _ . Dat is een kwestie van smaak en stijl.

  • De eerste parameter name heeft geen standaardwaarde, omdat het te allen tijde vereist is.
  • Andere parameters kunnen worden weggelaten.
  • Minstens één is vereist, of een WARNING wordt verhoogd en er gebeurt verder niets.
  • De UPDATE zal alleen kolommen wijzigen voor bepaalde parameters.
  • Kan eenvoudig worden uitgebreid voor N parameters.

Functie-oproep

Sinds Postgres 9.5 :

De eenvoudige manier is met positionele notatie voor parameters. Dit laat alleen toe om de meest rechtse parameter(s) weg te laten:

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

Benoemde notatie staat toe om elke . weg te laten parameter met een standaardwaarde:

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

Beide kunnen worden gecombineerd in gemengde notatie :

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

In Postgres 9.4 of ouder, := werd gebruikt voor toewijzing in het gesprek:

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

Nog steeds geldig in Postgres 12 voor achterwaartse compatibiliteit, maar gebruik liever de moderne notatie.



  1. Awesome 24 Concurrent Manager Sollicitatievragen

  2. Hoe functieparameterlijsten te krijgen (zodat ik een functie kan laten vallen)

  3. Wanneer moeten we NVARCHAR/NCHAR gebruiken in plaats van VARCHAR/CHAR in SQL Server?

  4. MySQL zoeken en tekst in een veld vervangen