Какой самый простой способ вернуть набор записей из хранимой процедуры PostgreSQL? - PullRequest
9 голосов
/ 10 января 2010

У меня просто есть таблица, которая содержит список стран и их коды стран 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 ]

12 голосов
/ 12 июля 2013

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

10 голосов
/ 10 января 2010

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

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;
...