Tải bản đầy đủ (.pptx) (12 trang)

Ngôn ngữ SQL Con trỏ (Cursor)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (264.71 KB, 12 trang )

CHƯƠNG 8
Kiểu dữ liệu con trỏ
CURSOR


1. Khai báo kiểu dữ liệu con trỏ
• Con trỏ (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.
• Đặc điểm :
 Cho phép thao tác lên từng dòng dữ liệu trả về từ lệnh SELECT.
 Do phải lặp qua từng dòng dữ liệu nên đây là cách xử lý chậm nhất


 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:
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ]
CURSOR FOR select_statement
    [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ] [;]

o cursor_name : tên của cursor, phải chứa 1 - 128 ký tự .
o select_statement : lựa chọn đến các cột trong bảng mà ta cần đọc.
• Lệnh SELECT trong cursor khơng chứa các mệnh đề COMPUTE,
COMPUTE BY, FOR BROWSE, và INTO .


• Trong đó :
 INSENSITIVE : tạo một bản copy tạm thay thế bảng chính. Con trỏ này
sẽ khơng được phép thay đổi và việc thay đổi sẽ không ảnh hưởng khi
dùng lệnh FETCH lấy giá trị con trỏ này
 READ_ONLY : con trỏ không thể cập nhật .


 SCROLL: cursor được phép di chuyển tới lui, qua lại các dòng mẩu tin
bên trong cursor.
 UPDATE [ OF column_name [ ,...n ]] để xác định khả năng cập nhật
từng cột với con trỏ. Nếu OF column_name [ ,...n ] được chỉ định, thì chỉ
các cột trong danh sách được sửa. Nếu có lệnh UPDATE mà khơng có
danh sách cột thì mặc định tất cả cột có thể chỉnh sửa.


• Ví dụ: ta khai báo một con trỏ đặt tên là cursorProduct :
DECLARE cursorProduct CURSOR FOR SELECT id, title
FROM Product

• Ngồi ra, có thể khai báo riêng CURSOR rồi sau đó
mới gán lệnh SELECT vào CURSOR
DECLARE @cursor_name
CURSOR SET @cursor_name = CURSOR FOR
select_statement


Khai báo mở rộng (SQL Extended Syntax)
DECLARE cursor_name
CURSOR
[LOCAL | GLOBAL]
[FORWARD_ONLY | SCROLL]
[STATIC | KEYSET | DYNAMIC ]
[READ_ONLY | SCROLL_LOCK]
FOR select_statement
[FOR UPDATE [OF column name[,...n]]]
[;]



2. Mở và lấy mẫu tin từ con trỏ
• Khi bắt đầu q trình đọc các dịng dữ liệu từ Cursor thì
phải mở con trỏ, thực hiện như sau:
Open [GLOBAL] ten_con_tro | @ten_con_tro
 GLOBAL: gọi biến toàn cục (mặc định là biến cục bộ [LOCAL]).
 @ten_con_tro : tên của biến cursor mà tham chiếu đến
một con trỏ.


• 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.
 Truy cập đến con trỏ bằng lệnh FETCH như sau:
FETCH [NEXT | PRIOR | FIRST | LAST | ABSOLUTE
{n | @nVar} | RELATIVE {n | @nVar}]
FROM [GLOBAL] ten_con_tro | @ten_con_tro
[INTO @ten_bien[du_lieu]]


Trong đó:
• NEXT, PRIOR, FIRST, LAST: chỉ định cách đọc dữ liệu.
• ABSOLUTE: chỉ định n số dịng dữ liệu cần đọc. Nếu:
 n = 0: khơng có giá trị trả về.
 n < 0: xuất phát từ phần đáy dữ liệu.
 n > 0: xuất phát từ phần đỉnh dữ liệu.
• RELATIVE cũng giống như ABSOLUTE nhưng bắt đầu từ vị trí hiện tại.


3. Kiểm tra trạng thái của con trỏ

o Để kiểm tra xem hệ thống đọc dữ liệu thành công hay thất bại, chúng ta sử dụng
lệnh @@FETCH_STATUS
 Để kiểm tra việc FETCH thành cơng thì kiểm tra điều kiện @@FETCH_STATUS = 0
Ví dụ: để đọc từng dòng từ đầu đến cuối sẽ làm như sau:
-- Thực hiện lần FETCH đầu tiên.

FETCH NEXT FROM contact_cursor;
-- Kiểm tra @@ FETCH_STATUS để xem có hàng nào nữa để đọc hay khơng.
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

FETCH NEXT FROM contact_cursor;
END


 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 mà nó
chiếm giữ bằng lệnh CLOSE hoặc DEALLOCATE:
-- Đóng con trỏ
CLOSE [GLOBAL] ten_con_tro | @ten_con_tro
Hoặc
-- Giải phóng bộ nhớ
DEALLOCATE [GLOBAL] ten_con_tro | @ten_con_tro
Lưu ý: CLOSE và DEALLOCATE có sự khác biệt:
o CLOSE sẽ đóng cursor lại nhưng có thể tái sử dụng lại ở lần sau.
o DEALLOCATE sẽ giải phóng hồn tồn cursor ra khỏi bộ nhớ, vì vậy nếu có lệnh
nào tham chiếu tới cursor có thể gây ra lỗi.



4. Phạm vi hoạt động của con trỏ
Phạm vi :
 LOCAL | GLOBAL : phạm vi hoạt động của biến. Local biến cục bộ,
Global biến toàn cục (tham chiếu đến bất kỳ thủ tục nào của kết nối tạo ra
biến cursor đó). Mặc định là LOCAL
 FORWARD_ONLY : duyệt từ mẩu tin đầu đến cuối cùng , theo chiều đi
tới.
 SCROLL: con trỏ được phép di chuyển tới lui, qua lại các dòng mẩu tin
bên trong.



×