Задать вопрос
hummingbird
@hummingbird

Как создать табличную функцию в PostgreSQL?

Написал функцию:
CREATE OR REPLACE FUNCTION public.get_full_info_about_passenger(INTEGER)
    RETURNS SETOF RECORD
AS
$BODY$
BEGIN
    SELECT id FROM public.passengers;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;


Пытаюсь вывести таблицу:
SELECT id FROM public.get_full_info_about_passenger(2);


Получаю:
a column definition list is required for functions returning "record"


SELECT id FROM public.get_full_info_about_passenger(2) f(id INTEGER);


Получаю:
ERROR: query has no destination for result data
Подсказка: If you want to discard the results of a SELECT, use PERFORM instead.
Где: PL/pgSQL function "get_full_info_about_passenger" line 8 at SQL statement


В чем проблема? Как создать табличную функцию?
  • Вопрос задан
  • 6787 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Извращенцы какие. Не используйте execute никогда, если без этого можно обойтись.

https://www.postgresql.org/docs/9.4/static/plpgsql...
return query select ....

Можно описать в хранимке, что именно она возвращает:
CREATE OR REPLACE FUNCTION public.get_full_info_about_passenger(INTEGER)
    RETURNS TABLE(
    id bigint
)
AS
$BODY$
BEGIN
    RETURN QUERY SELECT p.id FROM public.passengers p;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;

И просто набор чисел:
CREATE OR REPLACE FUNCTION public.get_full_info_about_passenger(INTEGER)
    RETURNS setof bigint
AS
$BODY$
BEGIN
    RETURN QUERY SELECT id FROM public.passengers;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;


Можно возвращать строки таблицы: (удобно, чтобы инкапсулировать какую-то заковыристую логику фильтрации)
CREATE OR REPLACE FUNCTION public.get_full_info_about_passenger(INTEGER)
    RETURNS setof public.passengers
AS
$BODY$
BEGIN
    RETURN QUERY SELECT * FROM public.passengers;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;


PS: хинт, который может сэкономить некоторое время: return query не прерывает выполнение кода, после него жизнь есть. И можно использовать в одной хранимке несколько return query, они будут вести себя как union all
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы