Sejak PostgreSQL 8.4 (yang tampaknya Anda jalankan), ada nilai default untuk parameter fungsi . Jika Anda menempatkan parameter terakhir dan memberikan default, Anda dapat dengan mudah menghilangkannya dari panggilan:
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$;
Poin utama:
-
Kata kunci
DEFAULT
digunakan untuk mendeklarasikan default parameter. Alternatif singkat:=
. -
Saya menghapus
param1
yang berlebihan dari contoh yang berantakan. -
Karena Anda mengembalikan
SELECT * FROM foobar
, nyatakan tipe pengembalian sebagaiRETURNS SETOF foobar
bukannyaRETURNS SETOF record
. Formulir terakhir dengan catatan anonim sangat berat, Anda harus memberikan daftar definisi kolom dengan setiap panggilan. -
Saya menggunakan array integer (
int[]
) sebagai parameter fungsi. MengadaptasiIF
ekspresi danWHERE
klausa yang sesuai. -
IF
pernyataan tidak tersedia dalam SQL biasa. HarusLANGUAGE plpgsql
untuk itu.
Panggilan dengan atau tanpa _ids
:
SELECT * FROM foofunc(1, '2012-1-1'::date);
Secara efektif sama:
SELECT * FROM foofunc(1, '2012-1-1'::date, '{}'::int[]);
Anda harus memastikan bahwa panggilan tersebut tidak ambigu. Jika Anda memiliki fungsi lain dengan nama dan dua parameter yang sama, Postgres mungkin tidak tahu mana yang harus dipilih. Pengecoran eksplisit (seperti yang saya tunjukkan) mempersempitnya. Selain itu, literal string yang tidak diketik juga berfungsi, tetapi menjadi eksplisit tidak ada salahnya.
Panggilan dari dalam fungsi lain:
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$;