Postgresql
June 4, 2022

Хранимые процедуры PostgreSQL, возвращающие набор данных(draft).

Периодически в телеграм-канале https://t.me/pgsql возникает вопрос: как создать хранимую процедуру, возвращающую набор данных. В MS SQL Server это сделать просто.

В PostgreSQL для этого нужно создать процедуру с выходным параметром типа refcursor.

В версии PG, которой я пользуюсь, out аргументы еще не допускаются, поэтому в сигнатуре процедуры выходной параметр должен быть объявлен как inout.

Далее используются данные из демонстрационной базы https://postgrespro.ru/education/demodb

Код процедуры:

CREATE or replace procedure bookings.p_cur(in p_range int, inout p_cur refcursor)
AS $
BEGIN
OPEN p_cur FOR
select aircraft_code::text code, model
FROM bookings.aircrafts where "range" > p_range;
END;
$ LANGUAGE plpgsql;

Проверим работу процедуры в анонимном блоке pl/pgsql:

DO $ DECLARE
 r1 REFCURSOR;
 rec RECORD;
begin 
call bookings.p_cur(7000, r1); --вызов процедуры
loop --построчный вывод
        FETCH r1 INTO rec;
        EXIT WHEN NOT FOUND;
        RAISE NOTICE '% %', rec.code, rec.model;
    END LOOP;
RAISE NOTICE 'финиш';
close r1;
END $
--Выводится 3 строки
--773 Боинг 777-300
--763 Боинг 767-300
--финиш

Проверено на версии PostgreSQL 12.6