PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Funkcje ze zmienną liczbą parametrów wejściowych

Zaawansowane funkcje, takie jak VARIADIC a nawet polimorficzne typy danych wejściowych i dynamiczny SQL są bardzo potężne. Ostatni rozdział tej odpowiedzi zawiera zaawansowany przykład:

  • Refaktoryzuj funkcję PL/pgSQL, aby zwrócić dane wyjściowe różnych zapytań SELECT

Ale w tak prostym przypadku, jak Twój, możesz po prostu użyć wartości domyślnych dla parametrów funkcji. Wszystko zależy od dokładnych wymagań.
Jeśli wszystkie kolumny, o których mowa, są zdefiniowane NOT NULL , prawdopodobnie byłoby to prostsze i szybsze:

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;

Przeczytaj o wartościach domyślnych w instrukcji!

Aby uniknąć konfliktów w nazewnictwie między parametrami a nazwami kolumn, zwyczajem jest przedrostek parametrów wejściowych przedrostkiem _ . To kwestia gustu i stylu.

  • Pierwszy parametr name nie ma wartości domyślnej, ponieważ jest wymagane przez cały czas.
  • Inne parametry można pominąć.
  • Co najmniej jeden jest wymagany lub WARNING jest podniesiony i nic więcej się nie dzieje.
  • UPDATE zmieni tylko kolumny dla podanych parametrów.
  • Można łatwo rozszerzyć o N parametry.

Wywołanie funkcji

Od Postgresu 9.5 :

Najprostszym sposobem jest notacja pozycyjna dla parametrów. Pozwala to tylko pominąć skrajne prawe parametry:

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

Zapis nazwany pozwala pominąć dowolne parametr, który ma wartość domyślną:

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

Oba można łączyć w notacji mieszanej :

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

W Postgresie 9.4 lub starszy, := został użyty do przypisania w wezwaniu:

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

Nadal ważny w Postgres 12 w celu zapewnienia kompatybilności wstecznej, ale raczej używaj nowoczesnej notacji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wskazówki dotyczące monitorowania PostgreSQL dla Moodle

  2. Jak zadeklarować zmienną w zapytaniu PostgreSQL

  3. ClassNotFoundException z PostgreSQL i JDBC

  4. BŁĄD:miejsca relacji nie istnieją Heroku db import

  5. Postgresql wymusza unikalną dwukierunkową kombinację kolumn