Я использую Postgresql 9.1, с Ubuntu 12.04.
Вдохновленный ответ Крейга на мой вопрос Конкатенацию setof типа или setof записи , я думал , я бы хорошо с использованием return query, setof recordи генератор серии в этой функцию plpgsql:
create or replace function compute_all_pair_by_craig(id_obj bigint)
returns setof record as $$
begin
return query select o.id, generate_series(0,o.value) from m_obj as o;
end;
$$ language plpgsql;
Во время выполнения я получаю ошибку:
ERROR: set_valued function called in context that cannot accept a set
Что не так ? В отличие от Крейга, я говорю, чтобы функция возвращалась setof record.
Я могу добиться чего-то, что работает точно так же, как Крейг, то есть определив тип, create type pair_id_value as (idx bigint, value integer)и моя функция plpgsql возвращает a setof of pair_id_valueвместо a setof record.
Но даже с этим рабочим решением я все еще не понимаю, почему select id, generate_series(0,13)один вернет результат в двух столбцах ... и, наоборот, вызов функции (возвращает setof pair_id_value) return query select id, generate_series(0,my_obj.value) from my_objвернет результат только в одном столбце, поле которого выглядит как это "(123123,0)" "(123123,1)" "(123123,2)" (3 строки), которые, очевидно, являются кортежами.
Это тот случай, когда временная таблица должна быть создана?
BEGINи пропущенная послеRETURN QUERY. После исправления этих ошибок я подтверждаю ошибку при возвратеrecord; объясню в ответ.