Zaawansowane funkcje, takie jak VARIADIC
a nawet polimorficzne typy danych wejściowych i dynamiczny SQL są bardzo potężne. Ostatni rozdział tej odpowiedzi zawiera zaawansowany przykład:
- Refaktoryzuj funkcję PL/pgSQL, aby zwrócić dane wyjściowe różnych zapytań SELECT
Ale w tak prostym przypadku, jak Twój, możesz po prostu użyć wartości domyślnych dla parametrów funkcji. Wszystko zależy od dokładnych wymagań.
Jeśli wszystkie kolumny, o których mowa, są zdefiniowane NOT NULL
, prawdopodobnie byłoby to prostsze i szybsze:
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;
Przeczytaj o wartościach domyślnych w instrukcji!
Aby uniknąć konfliktów w nazewnictwie między parametrami a nazwami kolumn, zwyczajem jest przedrostek parametrów wejściowych przedrostkiem _
. To kwestia gustu i stylu.
- Pierwszy parametr
name
nie ma wartości domyślnej, ponieważ jest wymagane przez cały czas. - Inne parametry można pominąć.
- Co najmniej jeden jest wymagany lub
WARNING
jest podniesiony i nic więcej się nie dzieje. UPDATE
zmieni tylko kolumny dla podanych parametrów.- Można łatwo rozszerzyć o N parametry.
Wywołanie funkcji
Od Postgresu 9.5 :
Najprostszym sposobem jest notacja pozycyjna dla parametrów. Pozwala to tylko pominąć skrajne prawe parametry:
SELECT update_site('foo', 'New York'); -- no telephone
Zapis nazwany pozwala pominąć dowolne parametr, który ma wartość domyślną:
SELECT update_site(name => 'foo', _telephone => 123); -- no city
Oba można łączyć w notacji mieszanej :
SELECT update_site('foo', _telephone => 123); -- still no city
W Postgresie 9.4 lub starszy, :=
został użyty do przypisania w wezwaniu:
SELECT update_site(name := 'foo', _telephone := 123);
SELECT update_site('foo', _telephone := 123);
Nadal ważny w Postgres 12 w celu zapewnienia kompatybilności wstecznej, ale raczej używaj nowoczesnej notacji.