Каков самый простой способ вернуть набор записей из хранимой процедуры 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), но я вытаскиваю волосы, пытаясь помнить.


Edit:

это работает:

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, но объявляет структуру таблицы встроенной вместо ссылки на существующий объект, поэтому соединения и такие будут работать.