Det angivne eksempel kan erstattes fuldstændigt med RETURN QUERY
:
BEGIN
RETURN QUERY SELECT y_.y, 'hi' FROM generate_series(1,10,1) AS y_(y)
END;
hvilket vil være en masse hurtigere.
Generelt bør du undgå iteration, hvor det er muligt, og i stedet foretrække sæt-orienterede operationer.
Hvor return next
over en loop er uundgåelig (hvilket er meget sjældent og for det meste begrænset til, når du har brug for undtagelseshåndtering), skal du indstille OUT
parameterværdier eller tabelparametre, og derefter return next
uden argumenter.
I dette tilfælde er dit problem linjen SELECT yr.y, 'hi';
som intet gør. Du antager, at den implicitte destination for en SELECT
er ud-parametrene, men det er ikke tilfældet. Du skal bruge ud-parametrene som sløjfevariabler som @peterm gjorde, bruge tildelinger eller bruge 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;