Eu uso o Postgresql 9.1, com o ubuntu 12.04.
Inspirado pela resposta de Craig à minha pergunta concatenação do tipo setof ou registro setof eu pensei que eu iria bem com o uso return query
, setof record
e um gerador de série para esta função 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 a execução, recebo o erro:
ERROR: set_valued function called in context that cannot accept a set
O que está errado ? Ao contrário de Craig, digo à função para retornar setof record
.
Posso conseguir algo que funcione exatamente como Craig, ou seja, definindo um tipo create type pair_id_value as (idx bigint, value integer)
e fazendo com que minha função plpgsql retorne a em setof of pair_id_value
vez de a setof record
.
Mas mesmo com essa solução de trabalho, ainda não entendo por que select id, generate_series(0,13)
sozinho retornará um resultado em duas colunas ... e, ao contrário, chamar a função (retorna setof pair_id_value) com return query select id, generate_series(0,my_obj.value) from my_obj
retornará um resultado em apenas uma coluna cujo campo se pareça com este "(123123,0)" "(123123,1)" "(123123,2)" (3 linhas) que são obviamente tuplas.
É um caso em que uma tabela temporária deve / deve ser criada?
BEGIN
e- vírgula após e um ausente após oRETURN QUERY
. Depois de corrigir esses erros, confirmo o erro ao retornarrecord
; irá explicar em resposta.