Khai báo và sử dụng Cursor
Trong các truy vấn T-SQL, như tại các Stored Procedure, ta có thể sử dụng các con trỏ CURSOR
để duyệt qua dữ liệu. Ta hiểu CURSOR
là một tập hợp kết quả truy vấn (các hàng), với CURSOR
ta có thể duyệt qua từng hàng kết quả để thi hành những tác vụ phức tạp.
Ở một thời điểm, CURSOR
có thể truy cập bởi một con trỏ đến một hàng của nó, bạn chỉ thể dịch chuyển con trỏ từ dòng này sang dòng khác.
Để sử dụng con trỏ trong các
Procedure
, cần thực hiện theo các bước:Bước 1: khai báo con trỏ, trỏ đến một tập dữ liệu (kết quả của
Select
) bằng lệnh DECLARE
Ví dụ có một tập dữ liệu từ câu lệnh Select như sau:
SELECT id,name FROM Product
Ta khai báo một con trỏ đặt tên là
cursorProduct
thì sẽ viết như sau:DECLARE cursorProduct CURSOR FOR SELECT id, title FROM Product
Bước 2: Khi bắt đầu quá trình đọc các dòng dữ liệu từ Cursor trên, thì phải mở con trỏ, thực hiện như sau:
Open cursorProduct
Khi Cursor được mở, con trỏ sẽ trỏ tới dòng đầu tiên của tập dữ liệu, lúc này có thể đọc nội dung dòng đó bằng lệnh
FETCH
Bước 3: Đọc dữ liệu sử dụng lệnh như sau:
FETCH NEXT FROM cursorProduct INTO @id, @title
Lệnh trên sẽ đọc nội dung dòng hiện tại, lưu vào biến @id và @title (vì dữ liệu trong Cursor này có 2 cột). Nếu đọc thành công thì dịch chuyển con trỏ tới dòng tiếp theo
Để kiệm tra việc
FETCH
thành công thì kiểm tra điều kiện @@FETCH_STATUS = 0
Kết hợp những điều trên lại, để đọc từng dòng từ đầu đến cuối sẽ làm như sau:
WHILE @@FETCH_STATUS = 0 BEGIN PRINT 'ID:' + CAST(@id as nvarchar) PRINT 'TITLE:' @title FETCH NEXT FROM cursorProduct INTO @it, @title END
Bước 4: sau khi không còn dùng đến Cursor, cần đóng lại và giải phóng các tài nguyên nó chiếm giữ
CLOSE cursorProduct DEALLOCATE cursorProduct
Tóm tắt lại các câu lệnh
Các câu lệnh sử dụng Cursor ở trên, tổng hợp lại trong một ví dụ hoàn chỉnh như sau:
--Khai báo biến @id, @title để lưu nội dung đọc DECLARE @id int DECLARE @title nvarchar(200) DECLARE cursorProduct CURSOR FOR -- khai báo con trỏ cursorProduct SELECT id, title FROM Product -- dữ liệu trỏ tới OPEN cursorProduct -- Mở con trỏ FETCH NEXT FROM cursorProduct -- Đọc dòng đầu tiên INTO @id, @title WHILE @@FETCH_STATUS = 0 --vòng lặp WHILE khi đọc Cursor thành công BEGIN --In kết quả hoặc thực hiện bất kỳ truy vấn --nào dựa trên kết quả đọc được PRINT 'ID:' + CAST(@id as nvarchar) PRINT 'TITLE:' @title FETCH NEXT FROM cursorProduct -- Đọc dòng tiếp INTO @id, @title END CLOSE cursorProduct -- Đóng Cursor DEALLOCATE cursorProduct -- Giải phóng tài nguyên