В нижней части этой страницы документации PostgreSQL есть раздел, описывающий, как вы можете вернуть один или несколько курсоров из функции. По сути, вы заставляете абонента указывать имя курсора (ов) в качестве параметров:
CREATE FUNCTION myfunc(refcursor, refcursor) RETURNS SETOF refcursor AS $$
BEGIN
OPEN $1 FOR SELECT * FROM table_1;
RETURN NEXT $1;
OPEN $2 FOR SELECT * FROM table_2;
RETURN NEXT $2;
END;
$$ LANGUAGE plpgsql;
-- need to be in a transaction to use cursors.
BEGIN;
SELECT * FROM myfunc('a', 'b');
FETCH ALL FROM a;
FETCH ALL FROM b;
COMMIT;
Страница предназначена для PostgreSQL 8.4, но этот фрагмент документации присутствует, по крайней мере, еще в 8.1 (версия, которую я использую). Как говорится в комментарии, вы должны находиться внутри транзакции, чтобы использовать курсоры, поскольку они неявно закрываются в конце каждой транзакции (то есть в конце каждого оператора, если включен режим автоматической фиксации).