PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Funzioni con numero variabile di parametri di ingresso

Funzionalità avanzate come VARIADIC o anche i tipi di input polimorfici e l'SQL dinamico sono molto potenti. L'ultimo capitolo di questa risposta fornisce un esempio avanzato:

  • Refactoring di una funzione PL/pgSQL per restituire l'output di varie query SELECT

Ma per un caso semplice come il tuo, puoi semplicemente utilizzare valori predefiniti per i parametri di funzione. Tutto dipende dai requisiti esatti.
Se le colonne in questione sono tutte definite NOT NULL , questo sarebbe probabilmente più semplice e veloce:

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;

Leggi i valori predefiniti nel manuale!

Per evitare conflitti di denominazione tra parametri e nomi di colonna, ho l'abitudine di anteporre i parametri di input con _ . È una questione di gusto e di stile.

  • Il primo parametro name non ha un valore predefinito, poiché è sempre necessario.
  • Altri parametri possono essere omessi.
  • È richiesto almeno uno o un WARNING viene sollevato e non succede nient'altro.
  • Il UPDATE cambierà solo le colonne per determinati parametri.
  • Può essere facilmente ampliato per N parametri.

Chiamata di funzione

Da Postgres 9.5 :

Il modo più semplice è con la notazione posizionale per i parametri. Ciò consente solo di omettere il parametro più a destra:

SELECT update_site('foo', 'New York');  -- no telephone

Nota con nome consente di omettere qualsiasi parametro che ha un valore predefinito:

SELECT update_site(name => 'foo', _telephone => 123);  -- no city

Entrambi possono essere combinati in notazione mista :

SELECT update_site('foo', _telephone => 123);  -- still no city

In Postgres 9.4 o precedente, := è stato utilizzato per l'assegnazione nella chiamata:

SELECT update_site(name := 'foo', _telephone := 123);
SELECT update_site('foo', _telephone := 123);

Ancora valido in Postgres 12 per la compatibilità con le versioni precedenti, ma usa piuttosto la notazione moderna.