Uso Postgresql 9.1, con Ubuntu 12.04.
Ispirato dalla risposta di Craig alla mia domanda concatenazione di tipo setof o registrare setof ho pensato di andare bene con l'utilizzo return query
, setof record
e un generatore di serie in questa funzione 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 l'esecuzione viene visualizzato l'errore:
ERROR: set_valued function called in context that cannot accept a set
Che c'è ? Contrariamente a Craig, dico alla funzione di tornare setof record
.
Posso ottenere qualcosa che funzioni facendo esattamente come Craig, cioè definendo un tipo create type pair_id_value as (idx bigint, value integer)
e facendo in modo che la mia funzione plpgsql restituisca un setof of pair_id_value
anziché un setof record
.
Ma anche con questa soluzione funzionante, ancora non capisco perché select id, generate_series(0,13)
da solo verrà restituito un risultato in due colonne ... e al contrario chiamando la funzione (restituisce setof pair_id_value) con return query select id, generate_series(0,my_obj.value) from my_obj
verrà restituito un risultato in una sola colonna il cui campo appare come questo "(123123,0)" "(123123,1)" "(123123,2)" (3 file) che sono tuple ovviamente.
È un caso in cui una / tabella temporanea deve / deve essere creata?
BEGIN
e virgola in eccesso dopo e uno mancante dopo ilRETURN QUERY
. Dopo aver corretto quegli errori, confermo l'errore al ritornorecord
; spiegherà in risposta.