L'esempio fornito può essere completamente sostituito con RETURN QUERY
:
BEGIN
RETURN QUERY SELECT y_.y, 'hi' FROM generate_series(1,10,1) AS y_(y)
END;
che sarà un lotto più veloce.
In generale, dovresti evitare l'iterazione ove possibile e preferire invece le operazioni orientate ai set.
Dove return next
su un ciclo è inevitabile (cosa molto rara e per lo più confinata a quando è necessaria la gestione delle eccezioni) devi impostare OUT
valori dei parametri o parametri della tabella, quindi return next
senza argomenti.
In questo caso il tuo problema è la riga SELECT yr.y, 'hi';
che non fa niente. Stai assumendo che la destinazione implicita di un SELECT
è il parametro out, ma non è così. Dovresti usare i parametri out come variabili di ciclo come ha fatto @peterm, usare le assegnazioni o usare SELECT INTO
:
FOR yr IN SELECT * FROM generate_series(1,10,1) AS y_(y)
LOOP
RAISE NOTICE 'Computing %', yr.y;
y := yr.y;
result := 'hi';
RETURN NEXT;
END LOOP;
RETURN;