L'exemple donné peut être entièrement remplacé par RETURN QUERY
:
BEGIN
RETURN QUERY SELECT y_.y, 'hi' FROM generate_series(1,10,1) AS y_(y)
END;
ce qui sera beaucoup plus rapide.
En général, évitez autant que possible les itérations et privilégiez plutôt les opérations orientées ensemble.
Où return next
sur une boucle est inévitable (ce qui est très rare et principalement limité au moment où vous avez besoin d'une gestion des exceptions), vous devez définir OUT
valeurs de paramètre ou paramètres de table, puis return next
sans arguments.
Dans ce cas, votre problème est la ligne SELECT yr.y, 'hi';
qui ne fait rien. Vous supposez que la destination implicite d'un SELECT
est les paramètres de sortie, mais ce n'est pas le cas. Vous devrez utiliser les paramètres out comme variables de boucle comme @peterm l'a fait, utiliser des affectations ou utiliser 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;