Het gegeven voorbeeld kan geheel worden vervangen door RETURN QUERY
:
BEGIN
RETURN QUERY SELECT y_.y, 'hi' FROM generate_series(1,10,1) AS y_(y)
END;
wat een veel zal zijn sneller.
Over het algemeen moet u iteratie waar mogelijk vermijden en in plaats daarvan de voorkeur geven aan set-georiënteerde bewerkingen.
Waar return next
over een lus onvermijdelijk is (wat zeer zeldzaam is, en meestal beperkt tot wanneer u uitzonderingen moet behandelen) moet u OUT
instellen parameterwaarden of tabelparameters, dan return next
zonder argumenten.
In dit geval is uw probleem de regel SELECT yr.y, 'hi';
die niets doet. Je gaat ervan uit dat de impliciete bestemming van een SELECT
is de out parameters, maar dat is niet het geval. Je zou de out-parameters moeten gebruiken als lusvariabelen zoals @peterm deed, toewijzingen gebruiken of SELECT INTO
gebruiken :
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;