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 record
y 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_value
lugar 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_obj
devolverá 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?
BEGIN
y 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.