Я використовую 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
.
Я можу домогтися чогось, що працює точно так само, як Craig, тобто, визначивши тип create type pair_id_value as (idx bigint, value integer)
і моя функція plpgsql повертає 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
; пояснимо у відповідь.