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 DECLAREVí 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
FETCHBướ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 = 0Kế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
