> как это лучше сделать?
Пишете процедуры, которые возвращают resultsets (лучше на SQL, чем на plpgsql, если это возможно), правильно их аннотируете (см. про volatility... и вообще, прочитайте документацию про это дело, там немного). Потом вызываете, и всё. ;)
> Не падает ли производительность от того, что написан в процедуре?
Зависит от того, на каком PL процедура (большинство PL, кроме SQL, складывают результаты SRF во временное хранилище перед возвратом, например) / что за запрос (кеширование планов может влиять).
Также см. вот это:
https://wiki.postgresql.org/wiki/Inlining_of_SQL_functions> Кешируется ли план запроса для процедуры?
Для процедуры целиком — нет.
> Кешируется ли для sql-запроса?
Да.
> Что быстрее?
Inlined SQL function — в общем, то же самое, что и view. А так, в общем, функции чуть медленнее, чем запросы в них (чудес не бывает, да ;) ).
> Если не процедура, то что использовать для выполнения запроса?
Выше имелись в виду функции, конечно. Если не они — то parameterized SQL, тут особо вариантов нет...