Pokročilé funkce jako VARIADIC
nebo dokonce polymorfní vstupní typy a dynamické SQL jsou velmi výkonné. Poslední kapitola této odpovědi poskytuje pokročilý příklad:
- Refaktorujte funkci PL/pgSQL tak, aby vrátila výstup různých SELECT dotazů
Ale pro jednoduchý případ, jako je ten váš, stačí použít výchozí hodnoty pro parametry funkce. Vše závisí na přesných požadavcích.
Pokud všechny příslušné sloupce jsou definovány NOT NULL
, asi by to bylo jednodušší a rychlejší:
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;
Přečtěte si o výchozích hodnotách v příručce!
Abych se vyhnul konfliktům názvů mezi parametry a názvy sloupců, je zvykem přidávat vstupní parametry předpony _
. To je věc vkusu a stylu.
- První parametr
name
nemá žádné výchozí nastavení, protože je vždy vyžadováno. - Další parametry lze vynechat.
- Je vyžadováno alespoň jedno nebo
WARNING
je zvednutý a nic jiného se neděje. - Položka
UPDATE
změní pouze sloupce pro dané parametry. - Lze snadno rozšířit o N parametry.
Volání funkce
Od Postgres 9.5 :
Nejjednodušší způsob je pomocí pozičního zápisu pro parametry. To umožňuje pouze vynechat parametr(y) zcela vpravo:
SELECT update_site('foo', 'New York'); -- no telephone
Pojmenovaná notace umožňuje vynechat jakékoli parametr, který má výchozí hodnotu:
SELECT update_site(name => 'foo', _telephone => 123); -- no city
Obojí lze kombinovat ve smíšeném zápisu :
SELECT update_site('foo', _telephone => 123); -- still no city
V Postgres 9.4 nebo starší, :=
bylo použito pro přiřazení ve výzvě:
SELECT update_site(name := 'foo', _telephone := 123);
SELECT update_site('foo', _telephone := 123);
Stále platné v Postgres 12 pro zpětnou kompatibilitu, ale raději použijte moderní zápis.