Ví dụ đã cho có thể được thay thế hoàn toàn bằng RETURN QUERY
:
BEGIN
RETURN QUERY SELECT y_.y, 'hi' FROM generate_series(1,10,1) AS y_(y)
END;
sẽ là một lô nhanh hơn.
Nói chung, bạn nên tránh lặp lại bất cứ khi nào có thể, và thay vào đó ưu tiên các hoạt động theo định hướng thiết lập.
Nơi return next
qua một vòng lặp là không thể tránh khỏi (điều này rất hiếm và chủ yếu được giới hạn khi bạn cần xử lý ngoại lệ), bạn phải đặt OUT
giá trị tham số hoặc tham số bảng, sau đó return next
mà không cần đối số.
Trong trường hợp này, vấn đề của bạn là dòng SELECT yr.y, 'hi';
mà không làm gì cả. Bạn đang giả định rằng đích ẩn của một SELECT
là các tham số ra, nhưng không phải vậy. Bạn phải sử dụng các tham số out như các biến vòng lặp như @peterm đã làm, sử dụng các phép gán hoặc sử dụng 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;