J'utilise Postgresql 9.1, avec Ubuntu 12.04.
Inspiré par la réponse de Craig à ma question Enchaînement de type setof ou un enregistrement setof je pensais aller bien à l' utilisation return query
, setof record
et un générateur de série dans cette fonction 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;
Pendant l'exécution, j'obtiens l'erreur:
ERROR: set_valued function called in context that cannot accept a set
Qu'est-ce qui ne va pas ? Contrairement à Craig, je dis à la fonction de revenir setof record
.
Je peux réaliser quelque chose qui fonctionne exactement comme Craig, c'est-à-dire en définissant un type create type pair_id_value as (idx bigint, value integer)
et que ma fonction plpgsql renvoie a setof of pair_id_value
au lieu de a setof record
.
Mais même avec cette solution de travail, je ne comprends toujours pas pourquoi select id, generate_series(0,13)
seul retournera un résultat dans deux colonnes ... et au contraire appeler la fonction (retourne setof pair_id_value) avec return query select id, generate_series(0,my_obj.value) from my_obj
retournera un résultat dans une seule colonne dont le champ ressemble ce "(123123,0)" "(123123,1)" "(123123,2)" (3 lignes) qui sont évidemment des tuples.
Est-ce un cas où une table temporaire doit / doit être créée?
BEGIN
et un manquant après leRETURN QUERY
. Après avoir corrigé ces erreurs, je confirme l'erreur lors du retourrecord
; expliquera en réponse.