Есть сложный код, обрабатывающий данные. Для увеличения производительности требуется, чтобы код полностью выполнялся на стороне базы данных. Для подобных целей отлично подходит анонимный блок кода - DO. Но у анонимных блоков кода есть проблема - они не приспособлены для возврата данных.
Есть какой-то DO-блок, из которого, к примеру, надо получить результат динамически сформированного запроса
DO $$
DECLARE
_query text;
BEGIN
_query := 'SELECT * FROM customers LIMIT 10';
EXECUTE _query;
END
$$;
это можно сделать с помощью курсоров, изменив код следующим образом
DO $$
DECLARE
_query text;
_cursor CONSTANT refcursor := '_cursor';
BEGIN
_query := 'SELECT * FROM customers LIMIT 10';
OPEN _cursor FOR EXECUTE _query;
END
$$;
так как областью видимости курсоров является транзакция, то придется весь код оформить одной транзакцией. Полный код будет выглядеть следующим образом
BEGIN;
DO $$
DECLARE
_query text;
_cursor CONSTANT refcursor := '_cursor';
BEGIN
_query := 'SELECT * FROM customers LIMIT 10';
OPEN _cursor FOR EXECUTE _query;
END
$$;
FETCH ALL FROM _cursor;
COMMIT;
Предупреждение
_cursor CONSTANT refcursor := '_cursor';
Обратите внимание, что имя переменной курсора должно совпадать со значением присваиваемой ей текстовой константы.
Ниже можно увидеть видео, как это делается с помощью утилиты psql