Извращенцы какие. Не используйте execute никогда, если без этого можно обойтись.
https://www.postgresql.org/docs/9.4/static/plpgsql...return query select ....
Можно описать в хранимке, что именно она возвращает:
CREATE OR REPLACE FUNCTION public.get_full_info_about_passenger(INTEGER)
RETURNS TABLE(
id bigint
)
AS
$BODY$
BEGIN
RETURN QUERY SELECT p.id FROM public.passengers p;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
И просто набор чисел:
CREATE OR REPLACE FUNCTION public.get_full_info_about_passenger(INTEGER)
RETURNS setof bigint
AS
$BODY$
BEGIN
RETURN QUERY SELECT id FROM public.passengers;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
Можно возвращать строки таблицы: (удобно, чтобы инкапсулировать какую-то заковыристую логику фильтрации)
CREATE OR REPLACE FUNCTION public.get_full_info_about_passenger(INTEGER)
RETURNS setof public.passengers
AS
$BODY$
BEGIN
RETURN QUERY SELECT * FROM public.passengers;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
PS: хинт, который может сэкономить некоторое время: return query не прерывает выполнение кода, после него жизнь есть. И можно использовать в одной хранимке несколько return query, они будут вести себя как union all