Bạn không thể DECLARE
(toàn cục) biến ( có có giải pháp thay thế
) cũng không lặp lại với SQL thuần túy - ngoại trừ CTE đệ quy được cung cấp bởi @bma
(thực sự đang lặp lại qua hàng, không lặp lại, nói đúng ra).
Tuy nhiên , có DO
tuyên bố
cho mã thủ tục đặc biệt như vậy. Được giới thiệu với Postgres 9.0. Nó hoạt động giống như một hàm một lần, nhưng không nhận bất kỳ tham số nào và không trả về bất kỳ thứ gì. Bạn có thể RAISE
thông báo và cộng sự, vì vậy ví dụ của bạn sẽ hoạt động tốt:
DO
$do$
DECLARE
_counter int := 0;
BEGIN
WHILE _counter < 10
LOOP
_counter := _counter + 1;
RAISE NOTICE 'The counter is %', _counter; -- coerced to text automatically
END LOOP;
END
$do$
Nếu không được chỉ định khác, ngôn ngữ trong nội dung được mặc định là plpgsql
. Bạn có thể sử dụng bất kỳ ngôn ngữ thủ tục đã đăng ký nào
mặc dù vậy, nếu bạn khai báo nó (như:LANGUAGE plpython
).
Postgres cũng cung cấp generate_series()
để tạo các tập hợp đặc biệt, điều này có thể làm giảm nhu cầu lặp lại trong nhiều trường hợp. Hãy thử tìm kiếm tại đây trên SO để biết các ví dụ.
Ngoài ra, bạn có thể sử dụng WHERE
mệnh đề trong CTE sửa đổi dữ liệu
trong SQL đơn giản đến các trường hợp rẽ nhánh và mô phỏng IF .. THEN .. ELSE .. END
...