Даденият пример може да бъде изцяло заменен с RETURN QUERY
:
BEGIN
RETURN QUERY SELECT y_.y, 'hi' FROM generate_series(1,10,1) AS y_(y)
END;
което ще бъде много по-бързо.
Като цяло трябва да избягвате итерация, когато е възможно, и вместо това да предпочитате операции, ориентирани към множество.
Където return next
през цикъл е неизбежно (което е много рядко и най-вече ограничено до когато имате нужда от обработка на изключения) трябва да зададете OUT
стойности на параметри или параметри на таблица, след което return next
без аргументи.
В този случай вашият проблем е редът SELECT yr.y, 'hi';
което не прави нищо. Вие приемате, че неявната дестинация на SELECT
е изходящите параметри, но това не е така. Ще трябва да използвате изходящите параметри като променливи за цикъл, както направи @peterm, да използвате присвоявания или да използвате 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;