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[]);
呼び出しが明確であることを確認する必要があります。同じ名前の別の関数と2つのパラメーターがある場合、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$;