sql >> Databáze >  >> RDS >> PostgreSQL

Funkce s proměnným počtem vstupních parametrů

Pokročilé funkce jako VARIADIC nebo dokonce polymorfní vstupní typy a dynamické SQL jsou velmi výkonné. Poslední kapitola této odpovědi poskytuje pokročilý příklad:

  • Refaktorujte funkci PL/pgSQL tak, aby vrátila výstup různých SELECT dotazů

Ale pro jednoduchý případ, jako je ten váš, stačí použít výchozí hodnoty pro parametry funkce. Vše závisí na přesných požadavcích.
Pokud všechny příslušné sloupce jsou definovány NOT NULL , asi by to bylo jednodušší a rychlejší:

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;

Přečtěte si o výchozích hodnotách v příručce!

Abych se vyhnul konfliktům názvů mezi parametry a názvy sloupců, je zvykem přidávat vstupní parametry předpony _ . To je věc vkusu a stylu.

  • První parametr name nemá žádné výchozí nastavení, protože je vždy vyžadováno.
  • Další parametry lze vynechat.
  • Je vyžadováno alespoň jedno nebo WARNING je zvednutý a nic jiného se neděje.
  • Položka UPDATE změní pouze sloupce pro dané parametry.
  • Lze snadno rozšířit o N parametry.

Volání funkce

Od Postgres 9.5 :

Nejjednodušší způsob je pomocí pozičního zápisu pro parametry. To umožňuje pouze vynechat parametr(y) zcela vpravo:

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

Pojmenovaná notace umožňuje vynechat jakékoli parametr, který má výchozí hodnotu:

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

Obojí lze kombinovat ve smíšeném zápisu :

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

V Postgres 9.4 nebo starší, := bylo použito pro přiřazení ve výzvě:

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

Stále platné v Postgres 12 pro zpětnou kompatibilitu, ale raději použijte moderní zápis.



  1. Znamená omezení Postgres UNIQUE index?

  2. Rails Console vyhledá uživatele podle řady ID

  3. Jak zkopíruji databázi SQL Azure na svůj místní vývojový server?

  4. Jak použít LOAD_FILE k načtení souboru do MySQL blob?