sql >> Database >  >> RDS >> PostgreSQL

Optioneel argument in PL/pgSQL-functie

Sinds PostgreSQL 8.4 (die u lijkt te gebruiken), zijn er standaardwaarden voor functieparameters . Als u uw parameter als laatste plaatst en een standaard invoert, kunt u deze eenvoudig weglaten uit de aanroep:

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

Belangrijkste punten:

  • Het trefwoord DEFAULT wordt gebruikt om de standaardinstellingen van parameters te declareren. Kort alternatief:= .

  • Ik heb de overbodige param1 . verwijderd van het rommelige voorbeeld.

  • Aangezien u SELECT * FROM foobar . retourneert , declareer het retourtype als RETURNS SETOF foobar in plaats van RETURNS SETOF record . Het laatste formulier met anonieme records is erg onpraktisch, u moet bij elke oproep een kolomdefinitielijst opgeven.

  • Ik gebruik een array van integer (int[] ) als functieparameter. Aangepast de IF uitdrukking en de WHERE clausule dienovereenkomstig.

  • IF instructies zijn niet beschikbaar in gewone SQL. Moet LANGUAGE plpgsql . zijn daarvoor.

Bellen met of zonder _ids :

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

In feite hetzelfde:

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

U moet ervoor zorgen dat de oproep ondubbelzinnig is. Als u een andere functie met dezelfde naam en twee parameters heeft, weet Postgres mogelijk niet welke te kiezen. Expliciete casting (zoals ik laat zien) beperkt het. Anders werken niet-getypte letterlijke tekenreeksen ook, maar expliciet zijn kan nooit kwaad.

Bellen vanuit een andere functie:

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. SQLite-trigger

  2. Exporteer SQL-querygegevens naar Excel

  3. ClusterControl - Geavanceerd back-upbeheer - mariabackup Deel I

  4. Betekent het evolueren van contactgegevens dat u uw database moet wijzigen?