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
--финиш