Тъй като PostgreSQL 8.4 (който изглежда използвате), има стойности по подразбиране за параметрите на функцията . Ако поставите параметъра си последен и предоставите стойност по подразбиране, можете просто да го пропуснете от повикването:
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$;
Основни точки:
-
Ключовата дума
DEFAULT
се използва за деклариране на параметри по подразбиране. Кратка алтернатива:=
. -
Премахнах излишния
param1
от разхвърляния пример. -
Тъй като връщате
SELECT * FROM foobar
, декларирайте типа на връщане катоRETURNS SETOF foobar
вместоRETURNS SETOF record
. Последната форма с анонимни записи е много тромава, ще трябва да предоставяте списък с дефиниции на колони при всяко обаждане. -
Използвам масив от цяло число (
int[]
) като параметър на функция. АдаптиранIF
израз иWHERE
клауза съответно. -
IF
операторите не са налични в обикновен SQL. Трябва да еLANGUAGE plpgsql
за това.
Обаждане със или без _ids
:
SELECT * FROM foofunc(1, '2012-1-1'::date);
На практика същото:
SELECT * FROM foofunc(1, '2012-1-1'::date, '{}'::int[]);
Трябва да се уверите, че обаждането е недвусмислено. Ако имате друга функция със същото име и два параметъра, Postgres може да не знае коя да избере. Изричното кастинг (както демонстрирам) го стеснява. В противен случай литералите на низове, които не са въведени, също работят, но да бъдеш изричен никога не вреди.
Обаждане от друга функция:
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$;