Какой самый простой способ вернуть набор записей из хранимой процедуры PostgreSQL?

У меня просто есть таблица, которая содержит список стран и их коды стран ISO. Я упаковываю запрос в хранимую процедуру (она же функция), например:

CREATE OR REPLACE FUNCTION get_countries(
                    ) RETURNS setof record AS $$
        SELECT country_code, country_name FROM country_codes
$$ LANGUAGE sql;

Я получаю ошибку:

ERROR:  a column definition list is required for functions returning "record"

Я знаю, что могу определить ТИП, а затем перебрать набор записей, как курсор, но у IIRC есть лучший способ сделать это в более новых версиях PostgreSQL (я использую 8.4.3), но я выдергиваю свои волосы, пытаясь помнить.


Редактировать:

Это работает:

CREATE OR REPLACE FUNCTION get_countries(
                    ) RETURNS setof country_codes AS $$
        SELECT country_code, country_name FROM country_codes
$$ LANGUAGE sql;

Обратите внимание на "ВОЗВРАЩАЕТСЯ setof [имя таблицы]". Но это не кажется самым гибким. Он развалится, если я попытаюсь вернуть объединение нескольких таблиц.

2 ответа

Решение

Вы должны иметь возможность использовать выходные параметры, например так:

CREATE OR REPLACE FUNCTION get_countries(country_code OUT text, country_name OUT text)
RETURNS setof record
AS $$ SELECT country_code, country_name FROM country_codes $$
LANGUAGE sql;

Существует также возможность использования RETURNS TABLE(...) (как описано в Руководстве по PostgreSQL), которое я лично предпочитаю:

CREATE OR REPLACE FUNCTION get_countries()
RETURNS TABLE(
    country_code text,
    country_name text
)
AS $$
    SELECT country_code, country_name FROM country_codes
$$ LANGUAGE sql;

Это фактически так же, как использование SETOF tablename, но объявляет структуру таблицы встроенной вместо ссылки на существующий объект, так что объединения и так далее будут работать.

Другие вопросы по тегам