Uvedený příklad může být zcela nahrazen RETURN QUERY
:
BEGIN
RETURN QUERY SELECT y_.y, 'hi' FROM generate_series(1,10,1) AS y_(y)
END;
což bude hodně rychleji.
Obecně byste se měli vyhnout iteracím, kdykoli je to možné, a místo toho upřednostňovat operace orientované na množinu.
Kde return next
přes smyčku je nevyhnutelné (což je velmi vzácné a většinou se omezuje na případy, kdy potřebujete zpracování výjimek), musíte nastavit OUT
hodnoty parametrů nebo parametry tabulky a poté return next
bez argumentů.
V tomto případě je vaším problémem řádek SELECT yr.y, 'hi';
která nic nedělá. Předpokládáte, že implicitní cíl SELECT
jsou výstupní parametry, ale není tomu tak. Parametry out byste museli použít jako proměnné smyčky jako @peterm, použít přiřazení nebo použít 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;