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.