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 alsRETURNS SETOF foobar
in plaats vanRETURNS 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 deIF
uitdrukking en deWHERE
clausule dienovereenkomstig. -
IF
instructies zijn niet beschikbaar in gewone SQL. MoetLANGUAGE 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$;