powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как вернуть таблицу из функции
4 сообщений из 4, страница 1 из 1
как вернуть таблицу из функции
    #39022189
Denis__Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
коллеги, доброго вечера!

помогите плиз с таким вопросом:
есть ряд функций, которые возвращают таблицу, набор и тип даных в возвращаемом наборе идентичный

хочу для них сделать обертку, которая бы по определеному условию определяла, какую из них вызвать, вызывала и проталкивала наверх набора данных, которая вернула та процедура.

т.е. что-то типа такого:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE OR REPLACE FUNCTION main_func (
  report_date timestamp, report_category INTEGER
)
RETURNS TABLE (
field 1 int, field2 int, field3 int)
) AS
$body$
BEGIN
IF report_category  = 1 THEN
select * from func1(report_date);
ELSE
select * from func2(report_date);
END IF;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;



когда вызываю верхнюю функцию так:
Код: plsql
1.
Select * from main_func ('2015-08-01', 1);



постгря выдает ошибку:
Код: plaintext
1.
2.
3.
ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function main_func (timestamp without time zone,integer) line 6 at SQL statement
(execution time: 375 ms; total time: 594 ms)
...
Рейтинг: 0 / 0
как вернуть таблицу из функции
    #39022190
Denis__Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а, забыл сказать, но это в общем понятно, что внутри func1 И func2 также возврщают таблицы с таким же набором полей, т.е.
Код: plsql
1.
2.
3.
RETURNS TABLE (
field 1 int, field2 int, field3 int)
) AS
...
Рейтинг: 0 / 0
как вернуть таблицу из функции
    #39022191
Denis__Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробовал вызывать так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE OR REPLACE FUNCTION main_func (
  report_date timestamp, report_category INTEGER
)
RETURNS TABLE (
field 1 int, field2 int, field3 int)
) AS
$body$
BEGIN
IF report_category  = 1 THEN
    RETURN QUERY (select * from func1(report_date));
ELSE
    RETURN QUERY (select * from func2(report_date));
END IF;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;



но он тогда слепляет мне поля field1, field2, field3 в одну строку и выдает таблицу и одной колонки, мне так не надо
...
Рейтинг: 0 / 0
как вернуть таблицу из функции
    #39022193
Denis__Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
коллеги, разобрался

именно вот так и будет работать, как я хотел:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE OR REPLACE FUNCTION main_func (
  report_date timestamp, report_category INTEGER
)
RETURNS TABLE (
field 1 int, field2 int, field3 int)
) AS
$body$
BEGIN
IF report_category  = 1 THEN
    RETURN QUERY (select * from func1(report_date));
ELSE
    RETURN QUERY (select * from func2(report_date));
END IF;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;



а у меня было вот так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
BEGIN
IF report_category  = 1 THEN
    RETURN QUERY (select * from func1(report_date));
ELSE
    RETURN QUERY (select * from func2(report_date));
END IF;
RETURN; --   <------- вот этот return мешал
END;
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как вернуть таблицу из функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]