Ich benutze Postgresql 9.1 mit Ubuntu 12.04.
Inspiriert von Craig Antwort auf meine Frage Verkettung von SETOF Typ oder SETOF Rekord Ich dachte , ich würde gut gehen mit der Verwendung return query
, setof record
und eine Reihe Generator in diese plpgsql Funktion:
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;
Während der Ausführung erhalte ich den Fehler:
ERROR: set_valued function called in context that cannot accept a set
Was ist falsch ? Im Gegensatz zu Craig fordere ich die Funktion auf, zurückzukehren setof record
.
Ich kann etwas erreichen, das genau wie Craig create type pair_id_value as (idx bigint, value integer)
funktioniert , dh indem ich einen Typ definiere und meine plpgsql-Funktion a setof of pair_id_value
anstelle von a zurückgibt setof record
.
Aber selbst mit dieser funktionierenden Lösung verstehe ich immer noch nicht, warum select id, generate_series(0,13)
allein ein Ergebnis in zwei Spalten zurückgegeben wird ... und im Gegenteil, wenn die Funktion (gibt setof pair_id_value zurück) mit return query select id, generate_series(0,my_obj.value) from my_obj
ein Ergebnis in nur einer Spalte zurückgibt , wie das Feld aussieht diese (123123,0) (123123,1) (123123,2) (3 Zeilen), die offensichtlich Tupel sind.
Ist es ein Fall, in dem eine temporäre Tabelle erstellt werden muss / sollte?
BEGIN
und ein fehlendes nach demRETURN QUERY
. Nachdem ich diese Fehler korrigiert habe, bestätige ich den Fehler bei der Rücksendungrecord
. wird in Antwort erklären.