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 jakoRETURNS SETOF foobar
zamiastRETURNS 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. DostosowanoIF
wyrażenie iWHERE
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$;