Содержание

Предыдущий раздел

Ошибки при работе с рекомендательными (advisory) блокировками

Следующий раздел

Вредные советы для программистов

Возврат данных из анонимного DO-блока

Есть сложный код, обрабатывающий данные. Для увеличения производительности требуется, чтобы код полностью выполнялся на стороне базы данных. Для подобных целей отлично подходит анонимный блок кода - 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

Дополнительная информация

PostgreSQL Documentation: DO

PostgreSQL Documentation: Cursors

comments powered by Disqus