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.