Есть процедура, возвращающая курсор в виде inout параметра.
BEGIN;
SELECT * FROM pkg_get_comm.get_comm_with_fields(refcur => 'qwe', in_user=> 111111111,in_tab=> 423,in_sys=> 330,in_comment=> 556);
FETCH ALL IN qwe;
Требуется написать функцию которая внутри выполнит процедуру, получит данные и вернет их из функции как из обычной таблицы.
1)
Руками явно достаем запрос из процедуры, выполняем его создав пустую таблицу методом ctas. Эта таблица не содержит данные и используется только для описания типа. Можно было бы создавать не таблицу, а явно тип в бд.
2) Создаем функцию
CREATE OR REPLACE FUNCTION pkg_get_comm.get_comm_with_fields_part(in_user numeric, in_tab numeric, in_sys numeric, in_comment numeric, in_is_debug numeric DEFAULT 0, in_theme numeric DEFAULT NULL::numeric)
RETURNS SETOF pkg_get_comm.t_type_gcwf
LANGUAGE plpgsql
STABLE SECURITY DEFINER
AS $function$
declare
_cur_name varchar(64):= md5(clock_timestamp()::varchar);
_rec pkg_get_comm.t_type_gcwf%rowtype;
_rcur refcursor;
begin
SELECT _cur_name
INTO _rcur
FROM pkg_get_comm.get_comm_with_fields(_cur_name::REFCURSOR,
in_user => in_user,
in_tab => in_tab,
in_sys => in_sys,
in_comment => in_comment);
LOOP
FETCH _rcur INTO _rec;
EXIT WHEN NOT FOUND;
RETURN NEXT _rec;
END LOOP;
end;
$function$
3) Пример использования. можно фильтровать по полям, запрашивать только нужные поля.
select * from pkg_get_comm.get_comm_with_fields_part(in_user=> 111111111,in_tab=> 423,in_sys=> 330,in_comment=> 556)
BEGIN;
SELECT * FROM pkg_get_comm.get_comm_with_fields(refcur => 'qwe', in_user=> 111111111,in_tab=> 423,in_sys=> 330,in_comment=> 556);
FETCH ALL IN qwe;
Требуется написать функцию которая внутри выполнит процедуру, получит данные и вернет их из функции как из обычной таблицы.
1)
Руками явно достаем запрос из процедуры, выполняем его создав пустую таблицу методом ctas. Эта таблица не содержит данные и используется только для описания типа. Можно было бы создавать не таблицу, а явно тип в бд.
2) Создаем функцию
CREATE OR REPLACE FUNCTION pkg_get_comm.get_comm_with_fields_part(in_user numeric, in_tab numeric, in_sys numeric, in_comment numeric, in_is_debug numeric DEFAULT 0, in_theme numeric DEFAULT NULL::numeric)
RETURNS SETOF pkg_get_comm.t_type_gcwf
LANGUAGE plpgsql
STABLE SECURITY DEFINER
AS $function$
declare
_cur_name varchar(64):= md5(clock_timestamp()::varchar);
_rec pkg_get_comm.t_type_gcwf%rowtype;
_rcur refcursor;
begin
SELECT _cur_name
INTO _rcur
FROM pkg_get_comm.get_comm_with_fields(_cur_name::REFCURSOR,
in_user => in_user,
in_tab => in_tab,
in_sys => in_sys,
in_comment => in_comment);
LOOP
FETCH _rcur INTO _rec;
EXIT WHEN NOT FOUND;
RETURN NEXT _rec;
END LOOP;
end;
$function$
3) Пример использования. можно фильтровать по полям, запрашивать только нужные поля.
select * from pkg_get_comm.get_comm_with_fields_part(in_user=> 111111111,in_tab=> 423,in_sys=> 330,in_comment=> 556)
Комментариев нет:
Отправить комментарий