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