Das angegebene Beispiel kann vollständig durch RETURN QUERY
ersetzt werden :
BEGIN
RETURN QUERY SELECT y_.y, 'hi' FROM generate_series(1,10,1) AS y_(y)
END;
das wird viel sein schneller.
Generell sollten Sie Iterationen möglichst vermeiden und stattdessen mengenorientierte Operationen bevorzugen.
Wo return next
über eine Schleife unvermeidlich ist (was sehr selten vorkommt und meistens darauf beschränkt ist, wenn Sie eine Ausnahmebehandlung benötigen), müssen Sie OUT
setzen Parameterwerte oder Tabellenparameter, dann return next
ohne Argumente.
In diesem Fall ist Ihr Problem die Zeile SELECT yr.y, 'hi';
was nichts bringt. Sie gehen davon aus, dass das implizite Ziel eines SELECT
ist der out-Parameter, aber das ist nicht der Fall. Sie müssten die out-Parameter als Schleifenvariablen verwenden, wie es @peterm getan hat, Zuweisungen verwenden oder SELECT INTO
verwenden :
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;