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.