Giả sử bạn có bảng thành viên, bảng này có đầy đủ thông tin và có cột quyền hạn, nhưng 1 người có nhiều quyền hạn. Do đó, bạn suy nghĩ sẽ bổ sung bảng chứa quyền hạn cho thành viên này. Tuy nhiên, dữ liệu bây giờ là khá nhiều, không thể xóa dữ liệu để làm lại. Cách duy nhất là tạo bảng mới, và cập nhật dữ liệu mã thành viên và mã quyền hạn sang bảng mới. Ý tưởng sử dụng con trỏ kết hợp trong thủ tục sql để biến điều này thành sự thật. Đồng thời, áp dụng vòng lặp for và while để duyệt qua các column trong cơ sở dữ liệu sqlserver.
Trong SQL để duyệt qua các phần tử cột (column) trong một bảng table thì chúng ta sử dụng Cursor.
Vậy Cursor là gì?
- Là một đối tượng CSDL, được sử dụng để thao tác với từng dòng dữ liệu.
- Khai báo con trỏ: DECLARE CURSOR
- Mở con trỏ: OPEN
- Nhận về các bản ghi: FETCH
- Đóng con trỏ: CLOSE
- Xoá các tham chiếu tới con trỏ: DEALLOCATE
Duyệt con trỏ
- FETCH [NEXT| PRIOR | FIRST |LAST| ABSOLUTE n]
- FROM [INTO ]
- FETCH FIRST: Truy xuất hàng đầu tiên.
- FETCH NEXT: Truy xuất hàng tiếp theo
- FETCH PRIOR: Truy xuất hàng trước hàng hiện tại.
- FETCH LAST: Truy xuất hàng cuối cùng.
- FETCH ABSOLUTE n: n là một số nguyên dương, truy xuất hàng n trong con trỏ.
- @@FETCH _STATUS: Trả về một số nguyên cho biết kết quả của lệnh truy xuất cuối cùng của con trỏ.
- @@CURSOR_ROWS: Trả về tổng số hàng hiện tại trong con trỏ đang mở.
Ví dụ: Mình có một bảng dữ liệu hình bên dưới
Bây giờ mình sẽ sử dụng code T-SQL để duyệt qua các phần tử trong bảng
Create proc [dbo].[proc_themQuyenHan]
as
begin
declare @maTV varchar(15)
declare @qh int
DECLARE @MyCursor CURSOR
DECLARE @i INT = 0
SET @MyCursor = CURSOR FAST_FORWARD
FOR
select MaSinhVien, quyenHan
from SinhVien
OPEN @MyCursor
FETCH NEXT FROM @MyCursor
INTO @maTV, @qh
WHILE @@FETCH_STATUS = 0
BEGIN
SET @i = @i +1
INSERT INTO DTNThanhVien_QuyenHan(MaThanhVien,QuyenHan)
values(@maTV, @qh)
FETCH NEXT FROM @MyCursor
INTO @maTV, @qh
end
CLOSE @MyCursor
DEALLOCATE @MyCursor
end
Kết quả sau khi chạy câu lệnh exec [dbo].[proc_themQuyenHan] trên