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.