我在ubuntu 12.04上使用Postgresql 9.1。
克雷格的回答启发,我的问题类型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
怎么了 ?与Craig相反,我告诉函数返回setof record
。
我可以实现与Craig完全一样的工作,即通过定义类型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
; 将在回答中解释。