Yo uso Postgresql 9.1, con ubuntu 12.04.
Inspirado por la respuesta de Craig a mi pregunta concatenación de tipo setof o registro setof pensé que iba a ir bien con el uso return query, setof recordy un generador de serie en esta función 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;
Durante la ejecución me sale el error:
ERROR: set_valued function called in context that cannot accept a set
Qué está mal ? Al contrario de Craig, le digo a la función que regrese setof record.
Puedo lograr algo que funcione haciendo exactamente como Craig, es decir, definiendo un tipo create type pair_id_value as (idx bigint, value integer)y haciendo que mi función plpgsql devuelva a en setof of pair_id_valuelugar de a setof record.
Pero incluso con esta solución de trabajo, todavía no entiendo por qué select id, generate_series(0,13)solo devolverá un resultado en dos columnas ... y, por el contrario, llamar a la función (devuelve setof pair_id_value) con return query select id, generate_series(0,my_obj.value) from my_objdevolverá un resultado en solo una columna cuyo campo se parece esto "(123123,0)" "(123123,1)" "(123123,2)" (3 filas) que obviamente son tuplas.
¿Es un caso donde se debe / se debe crear una tabla temporal?
BEGINy coma en exceso después y uno que falta después delRETURN QUERY. Después de corregir esos errores, confirmo el error al regresarrecord; explicará en respuesta.