PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Fonctions avec nombre variable de paramètres d'entrée

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.