Exemplet som ges kan helt ersättas med RETURN QUERY
:
BEGIN
RETURN QUERY SELECT y_.y, 'hi' FROM generate_series(1,10,1) AS y_(y)
END;
vilket kommer att bli en mängd snabbare.
Generellt bör du undvika iteration där det är möjligt, och istället föredrar set-orienterade operationer.
Där return next
över en slinga är oundvikligt (vilket är mycket sällsynt och oftast begränsat till när du behöver hantering av undantag) måste du ställa in OUT
parametervärden eller tabellparametrar, return next
utan argument.
I det här fallet är ditt problem raden SELECT yr.y, 'hi';
som inte gör någonting. Du antar att den implicita destinationen för en SELECT
är ut-parametrarna, men så är inte fallet. Du måste använda ut-parametrarna som loopvariabler som @peterm gjorde, använda tilldelningar eller använda 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;