sql >> Databasteknik >  >> RDS >> PostgreSQL

Valfritt argument i PL/pgSQL-funktionen

Sedan PostgreSQL 8.4 (som du verkar köra) finns det standardvärden för funktionsparametrar . Om du sätter din parameter sist och anger en standard kan du helt enkelt utelämna den från anropet:

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$;

Huvudpunkter:

  • Sökordet DEFAULT används för att deklarera parameterstandarder. Kort alternativ:= .

  • Jag tog bort den redundanta param1 från det röriga exemplet.

  • Eftersom du returnerar SELECT * FROM foobar , deklarera returtypen som RETURNS SETOF foobar istället för RETURNS SETOF record . Den sistnämnda formen med anonyma poster är mycket svårhanterlig, du måste tillhandahålla en kolumndefinitionslista med varje samtal.

  • Jag använder en array med heltal (int[] ) som funktionsparameter. Anpassade IF uttryck och WHERE klausul i enlighet därmed.

  • IF satser är inte tillgängliga i vanlig SQL. Måste vara LANGUAGE plpgsql för det.

Ring med eller utan _ids :

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

I praktiken samma sak:

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

Du måste se till att samtalet är entydigt. Om du har en annan funktion med samma namn och två parametrar kanske Postgres inte vet vilken du ska välja. Explicit casting (som jag visar) begränsar det. Annars fungerar oskrivna strängbokstavar också, men att vara tydlig skadar aldrig.

Ring från en annan funktion:

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. Old Style Oracle Outer Join-syntax - Varför hitta (+) på höger sida av likhetstecknet i en Left Outer-join?

  2. Problem med att skapa främmande nyckel i Oracle

  3. SQL Server Databas Change Listener C#

  4. Android - försök att öppna ett redan stängt objekt igen:SQLiteQuery med loaderManager