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 somRETURNS SETOF foobar
istället förRETURNS 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. AnpassadeIF
uttryck ochWHERE
klausul i enlighet därmed. -
IF
satser är inte tillgängliga i vanlig SQL. Måste varaLANGUAGE 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$;