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

Opcjonalny argument w funkcji PL/pgSQL

Od PostgreSQL 8.4 (który wydaje się być uruchomiony) istnieją domyślne wartości parametrów funkcji . Jeśli umieścisz swój parametr na końcu i podasz domyślny, możesz po prostu pominąć go w wywołaniu:

CREATE OR REPLACE FUNCTION foofunc(_param1 integer
                                 , _param2 date
                                 , _ids    int[] DEFAULT '{}')
  RETURNS SETOF foobar         -- declare return type!
  LANGUAGE plpgsql AS
$func$
BEGIN  -- required for plpgsql
   IF _ids <> '{}'::int[] THEN  -- exclude empty array and NULL
      RETURN QUERY
      SELECT *
      FROM   foobar
      WHERE  f1 = _param1
      AND    f2 = _param2
      AND    id = ANY(_ids);    -- "IN" is not proper syntax for arrays
   ELSE
      RETURN QUERY
      SELECT *
      FROM   foobar
      WHERE  f1 = _param1
      AND    f2 = _param2;
   END IF;
END  -- required for plpgsql
$func$;

Główne punkty:

  • Słowo kluczowe DEFAULT służy do deklarowania wartości domyślnych parametrów. Krótka alternatywa:= .

  • Usunąłem nadmiarowy param1 z niechlujnego przykładu.

  • Ponieważ zwracasz SELECT * FROM foobar , zadeklaruj zwracany typ jako RETURNS SETOF foobar zamiast RETURNS SETOF record . Ta ostatnia forma z anonimowymi zapisami jest bardzo nieporęczna, przy każdym wywołaniu musiałbyś dostarczać listę definicji kolumn.

  • Używam tablicy liczb całkowitych (int[] ) jako parametr funkcji. Dostosowano IF wyrażenie i WHERE klauzulę odpowiednio.

  • IF instrukcje nie są dostępne w zwykłym języku SQL. Musi to być LANGUAGE plpgsql za to.

Zadzwoń z lub bez _ids :

SELECT * FROM foofunc(1, '2012-1-1'::date);

Skutecznie to samo:

SELECT * FROM foofunc(1, '2012-1-1'::date, '{}'::int[]);

Musisz upewnić się, że połączenie jest jednoznaczne. Jeśli masz inną funkcję o tej samej nazwie i dwóch parametrach, Postgres może nie wiedzieć, którą wybrać. Jawne rzucanie (jak demonstruję) zawęża to. W przeciwnym razie, nieopisane literały ciągów również działają, ale bycie jednoznacznym nigdy nie boli.

Zadzwoń z innej funkcji:

CREATE FUNCTION foofuncwrapper(_param1 integer, _param2 date)
  RETURNS SETOF foobar
  LANGUAGE plgpsql AS
$func$
DECLARE
   _ids int[] := '{1,2,3}';
BEGIN
   -- whatever

   RETURN QUERY
   SELECT * FROM foofunc(_param1, _param2, _ids);
END
$func$;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pobierz rekordy, które są niezerowe po przecinku w PostgreSQL

  2. Spowodowane przez:java.lang.NoSuchMethodError:org.postgresql.core.BaseConnection.getEncoding()Lorg/postgresql/core/Encoding;

  3. Rails 3.2 Postgres Save Error ActiveRecord::StatementInvalid:PG::Error:ERROR:Błąd składni w pobliżu 'T' na pozycji 5

  4. Czy mogę sprawić, by funkcja plpgsql zwróciła liczbę całkowitą bez użycia zmiennej?

  5. Aktualizacja JLabel przez SetIcon z typu danych bytea w postgres