Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Возвращение результата из временной таблицы в процедуре  [new]
jango77
Member

Откуда:
Сообщений: 42
Здравствуйте

Подскажите, пожалуйста, как правильно возвращать результат с временной таблицы через процедуру?

Есть запрос

CREATE OR REPLACE PROCEDURE p_get_data()

LANGUAGE SQL
AS $$
  
BEGIN

	-- Drop temporary tables
	DROP TABLE IF EXISTS temp_report;

	-- Create temporary table
	CREATE TEMP TABLE temp_report AS

	-- Insert data into temporary table
	SELECT 
	     "Data_Date",
	     "Amount_A",
	     "Amount_B"
	FROM table;


	-- Return result
	SELECT
	     "Data_Date",
	     'A' AS "Type",
	     "Amount_A" AS "Value"
	FROM temp_report

	UNION ALL

	SELECT
	     "Data_Date",
	     'B' AS "Type",
	     "Amount_B" AS "Value"
	FROM temp_report;

	-- Drop temporary tables
	DROP TABLE IF EXISTS temp_report;	

END; 

$$;


Процедура применяется, но при ее вызове пишет, что не возможно вывести результат
Подскажите, как это правильно сделать?
17 апр 21, 10:38    [22310117]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата из временной таблицы в процедуре  [new]
MikeR.Ru
Member

Откуда:
Сообщений: 115
1) зачем вы удаляете временную таблицу? Боитесь, что в сессии, кто-то её еще раз использует? Тогда лучше CTE использовать
2) возврат из процедуры или функции можно оформить через возврат табличного типа
returns 
table(type text, amount money) as


и пишите что-то вроде этого

return query
 	SELECT  temp_report.type::text, temp_report.amount::money FROM 
      temp_report;
19 апр 21, 09:35    [22310752]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата из временной таблицы в процедуре  [new]
Ы2
Member

Откуда:
Сообщений: 212
jango77, процедуры в PostgreSQL не возвращают значения.
19 апр 21, 13:19    [22310909]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата из временной таблицы в процедуре  [new]
_Drive_
Member

Откуда: Москва
Сообщений: 179
Всем привет ..

Я делал так:

delimiter #

CREATE or replace function ampg_MyFunction( in param1 integer, .... )
returns SETOF REFCURSOR
as $$
declare
_ref1 constant refcursor := '_ref1';
_ref2 constant refcursor := '_ref2';
begin
......
OPEN _ref1 FOR
select bla-bla-bla from mytable1 where ....;
return next _ref1;

OPEN _ref2 FOR
select ops-ops-ops from mytable2 where ....;
return next _ref2;
...
rerturn;
end;
$$
language plpgSQL VOLATILE
#


Вызов и получение результата-

set VERBOSITY terse
do $$
declare
ref1 refcursor := '_ref1';
ref2 refcursor := '_ref2';
rec1 record;
rec2 record;
begin

perform public.ampg_Myfinction(1, ...);

loop
fetch ref1 into rec1;
exit when not found;
raise notice '%', rec1;
end loop;
loop
fetch ref2 into rec2;
exit when not found;
raise notice '%', rec2;
end loop;
end;
$$ language plpgsql;

или так

select * from public.ampg_MyFunction(1, ...);
FETCH ALL FROM _ref1;
FETCH ALL FROM _ref2;
21 апр 21, 10:38    [22311800]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата из временной таблицы в процедуре  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4719
jango77

Процедура применяется, но при ее вызове пишет, что не возможно вывести результат
Подскажите, как это правильно сделать?


Для начала поймите действительно ли вам нужна процедура (с управлением транзакциями) в этом месте?
(а не функция без транзакций которая может отдавать результат).

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
21 апр 21, 11:37    [22311842]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата из временной таблицы в процедуре  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 888
jango77, если по каким-то причинам не устраивает функция (например, внутри процедуры необходимо фиксировать или откатывать транзакцию), то можно просто не удалять созданную временную таблицу. Она никуда не денется после завершения процедуры.
24 апр 21, 15:30    [22313605]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить