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