Fonctionnalités avancées telles que VARIADIC
ou même les types d'entrée polymorphes et le SQL dynamique sont très puissants. Le dernier chapitre de cette réponse fournit un exemple avancé :
- Refactoriser une fonction PL/pgSQL pour renvoyer la sortie de diverses requêtes SELECT
Mais pour un cas simple comme le vôtre, vous pouvez simplement utiliser les valeurs par défaut pour les paramètres de fonction. Tout dépend des exigences exactes.
Si les colonnes en question sont toutes définies NOT NULL
, ce serait probablement plus simple et plus rapide :
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;
Lisez à propos des valeurs par défaut dans le manuel !
Pour éviter les conflits de nommage entre les paramètres et les noms de colonnes, je prends l'habitude de préfixer les paramètres d'entrée avec _
. C'est une question de goût et de style.
- Le premier paramètre
name
n'a pas de valeur par défaut, car elle est requise à tout moment. - D'autres paramètres peuvent être omis.
- Au moins un est requis, ou un
WARNING
est déclenché et rien d'autre ne se passe. - La
UPDATE
ne changera les colonnes que pour des paramètres donnés. - Peut facilement être étendu pour N paramètres.
Appel de fonction
Depuis Postgres 9.5 :
La méthode la plus simple consiste à utiliser la notation positionnelle pour les paramètres. Cela permet uniquement d'omettre le(s) paramètre(s) le plus à droite :
SELECT update_site('foo', 'New York'); -- no telephone
Notation nommée permet d'omettre tout paramètre qui a une valeur par défaut :
SELECT update_site(name => 'foo', _telephone => 123); -- no city
Les deux peuvent être combinés en notation mixte :
SELECT update_site('foo', _telephone => 123); -- still no city
Dans Postgres 9.4 ou plus ancien, :=
a été utilisé pour l'affectation dans l'appel :
SELECT update_site(name := 'foo', _telephone := 123);
SELECT update_site('foo', _telephone := 123);
Toujours valide dans Postgres 12 pour la rétrocompatibilité, mais utilisez plutôt la notation moderne.