Opcjonalny argument w funkcji PL / pgSQL

Próbuję napisać funkcję PL / pgSQL z opcjonalnymi argumentami. Wykonuje zapytanie oparte na przefiltrowanym zbiorze rekordów (jeśli jest określony), w przeciwnym razie wykonuje zapytanie dotyczące całego zestawu danych w tabeli.

Na przykład(PSEUDO KOD):

CREATE OR REPLACE FUNCTION foofunc(param1 integer, param2 date, param2 date, optional_list_of_ids=[]) RETURNS SETOF RECORD AS $
    IF len(optional_list_of_ids) > 0 THEN
        RETURN QUERY (SELECT * from foobar where f1=param1 AND f2=param2 AND id in optional_list_of_ids);
    ELSE
        RETURN QUERY (SELECT * from foobar where f1=param1 AND f2=param2);
    ENDIF
$ LANGUAGE SQL;

Jaki byłby właściwy sposób wdrożenia tej funkcji?

Na marginesie chciałbym wiedzieć, jak mógłbym nazwać taką funkcję inną funkcją zewnętrzną. Tak bym to zrobił - czy jest poprawny, czy jest lepszy sposób?

CREATE FUNCTION foofuncwrapper(param1 integer, param2 date, param2 date) RETURNS SETOF RECORD AS $
BEGIN
   CREATE TABLE ids AS SELECT id from foobar where id < 100;
   RETURN QUERY (SELECT * FROM foofunc(param1, param2, ids));
END
$ LANGUAGE SQL

questionAnswers(3)

yourAnswerToTheQuestion