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