Bài 12 kiểu dữ liệu con trỏ cursor - Pdf 14

1
Bài 12: Kiểu dữ liệu con trỏ - Cursor
1. Ý nghĩa sử dụng: Dữ liệu con trỏ cho phép lưu trữ một
tập hợp các mẫu tin từ bảng.
2. Khai báo biến con trỏ
3. Sử dụng biến con trỏ
4. Kiểm tra trạng thái của con trỏ - @@Fetch_Status
5. Phạm vi họat động của biến con trỏ
6. Phân loại con trỏ
7. Cập nhật dữ liệu trong con trỏ
2
Khai báo biến con trỏ
SQL 92 Syntax
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ]
CURSOR FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ , n ] ] } ]
INSENSITIVE – SQL sẽ tạo ra một bảng dữ liệu tạm thời trong
TempDB vì vậy các sửa đổi dữ liệu trong bảng cũ không có tác
dụng lên con trỏ.
SCROLL - Mặc định chỉ cho phép thực hiện FETCH NEXT, nếu có
thêm tham số SCROLL thì có thể thực hiện: FIRST, LAST,
PRIOR, NEXT, RELATIVE, ABSOLUTE
UPDATE [OF column_name [, n]] – danh sách các trường
có thể update dữ liệu. Nếu chỉ có UPDATE thì tất cả các
trường đều có thể cập nhập dữ liệu.
3
Khai báo biến con trỏ (2)
Transact-SQL Extended Syntax
DECLARE cursor_name CURSOR[ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]

6
@@Fetch_Status để kiểm tra.
0 - Nếu như lấy mẫu tin thành công;
1 - Lấy mẫu tin thất bại với lý do là con trỏ đã ra quá vùng giới hạn BOF hoặc EOF,
2 - Lấy mẫu tin thất bại với lý do là mẫu tin không tồn tại.
use adventureworks
Declare cProd Cursor for select ProductID, Name from
Production.Product
Declare @masp varchar(10), @TenSP nvarchar(30), @STT int
Open cProd
Fetch next From cProd into @masp,@tenSP; set @STT=1
While @@Fetch_Status=0
Begin
Print 'STT:='+ cast(@STT as varchar(4))+';Ma san pham :=
'+@masp +';Ten san pham := ' +@TenSP
Fetch next From cProd into @masp,@tenSP ; set @STT=@STT+1
End
close cProd; deallocate cProd
Kiểm tra trạng thái của con trỏ
7
Phạm vi họat động của biến con trỏ Local
Local – là phạm vi mặc định - chỉ hoạt động trong một thủ tục
Global – có phạm vi hoạt động trong toàn bộ kết nối
Ví dụ: Khai báo con trỏ với phạm vi là local
Tạo 02 thủ tục:
- spCursorLocal1: có khai báo con trỏ cProdLocal truy cập dữ liệu
trong bảng Product và chỉ hiển thị 02 bản ghi đầu tiên.
- spCursorLocal2: gọi thực hiện spCursorLocal1 và sau đó có gắng
sử dụng cProdLocal đã khai báo trong spCursorLocal1 biển hiện thị
các bản ghi còn lại.

close cProdLocal
deallocate cProdLocal
exec spCursorLocal2
10
Phạm vi họat động của biến con trỏ Local (4)
STT:=1;Ma san pham := 1;Ten san pham := Adjustable Race
STT:=2;Ma san pham := 2;Ten san pham := Bearing Ball
Msg 16916, Level 16, State 1, Procedure spCursorLocal2, Line 7
A cursor with the name 'cProdLocal' does not exist.
Msg 16916, Level 16, State 1, Procedure spCursorLocal2, Line 15
A cursor with the name 'cProdLocal' does not exist.
Msg 16916, Level 16, State 1, Procedure spCursorLocal2, Line 16
A cursor with the name 'cProdLocal' does not exist.
11
Phạm vi họat động của biến con trỏ Global
Sử đổi phạm vi của con trỏ trong spCursorLocal1 thành global, ta xây
dựng một kịch bản tương ứng với hai thủ tục là
spCursorGlobal1 và spCursorGlobal2
12
Phân loại con trỏ

Static - con trỏ tĩnh

Keyset – con trỏ keyset

Dynamic – con trỏ động
13
Static cursor

Khi con trỏ này được tạo ra, những mẫu tin được copy vào


Việc thêm mới bản ghi vào bảng gốc không tác động đến
con trỏ
15
Con trỏ Keyset (2)

Xem xét kịch bản (Lecture8-KeySetCursor.sql):

Tạo con trỏ KeySet – hiển thị dữ liệu trong con trỏ

Cập nhật dữ liệu vào bảng dữ liệu gốc – hiển thị

Tiếp tục hiển thị lại dữ liệu trong con trỏ (kiểm tra sự thay đổi
của dữ liệu?)

Kiểm tra thêm trường hợp thêm, xóa dữ liệu
16
Dynamic cursor

Con trỏ Dynamic không sử dụng đến bảng tạm trong TempDB
mà thao tác trực tiếp với bảng gốc.

Khác với con trỏ keyset, dynamic không yêu cầu unique index

Mọi thao tác thêm, sửa, xóa đều có tác động ngay lập tức đến
con trỏ Dynamic.

Xem kịch bản trong Lecture8-Dynamic.sql:

Tạo con trỏ Dynamic – Hiển thị dữ liệu


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status