Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 17 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
17
Dung lượng
161 KB
Nội dung
1 Bài 12: Kiểudữliệucontrỏ - Cursor 1. Ý nghĩa sử dụng: Dữliệucontrỏ 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 contrỏ 3. Sử dụng biến contrỏ 4. Kiểm tra trạng thái của contrỏ - @@Fetch_Status 5. Phạm vi họat động của biến contrỏ 6. Phân loại contrỏ 7. Cập nhật dữliệu trong contrỏ 2 Khai báo biến contrỏ 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 contrỏ (2) Transact-SQL Extended Syntax DECLARE cursor_name CURSOR[ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] FOR select_statement[ FOR UPDATE [ OF column_name [ , n ] ] ] 4 Mở contrỏ Open <ten_contro> Lấy mẫu tin từ contrỏ Sau khi mở con trỏ, bước tiếp theo là chúng ta sẽ lấy giá trị các cột trong các mẫu tin lưu trong con trỏ. FETCH [ NEXT | PRIOR | FIRST | LAST] FROM cursor_name [ INTO @variable_name [ , n ] ] FETCH – Lấy dữliệu Next - Đến mẫu tin tiếp theo Prior -Về mẫu tin trước đó First –Về mẫu tin đầu tiên Last – Đến mẫu tin cuối cùng INTO @variable_name [ , n ] - Dữliệu của các cột trong mẫu tin sẽ được đưa vào các biến tương ứng Sử dụng contrỏ 5 Ví dụ về sử dụng biến contrỏ use adventureworks Declare cProd Cursor for select ProductID, Name from Production.Product Declare @masp varchar(10), @TenSP nvarchar(30) Open cProd Fetch next From cProd into @masp,@tenSP Print 'Ma san pham := '+@masp +';Ten san pham := ' +@TenSP close cProd deallocate cProd 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à contrỏ đã 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 contrỏ 7 Phạm vi họat động của biến contrỏ 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 contrỏ với phạm vi là local Tạo 02 thủ tục: - spCursorLocal1: có khai báo contrỏ 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. => Trong trường hợp này phát sinh lỗi do phạm vi họat động của contrỏ local. 8 Phạm vi họat động của biến contrỏ Local (2) use adventureworks; alter PROCEDURE spCursorLocal1 as Declare cProdLocal Cursor local for select ProductID, Name from Production.Product Declare @masp varchar(10), @TenSP nvarchar(30), @STT int Open cProdLocal ; Fetch next From cProdLocal into @masp,@tenSP; set @STT=1 While ((@STT<3)) and (@@Fetch_Status=0) Hien 02 b-ghi dau Begin Print 'STT:='+ cast(@STT as varchar(4))+';Ma san pham := '+@masp +';Ten san pham := ' +@TenSP Fetch next From cProdLocal into @masp,@tenSP; set @STT=@STT+1 End 9 Phạm vi họat động của biến contrỏ Local (3) alter PROCEDURE spCursorLocal2 as declare @STT int, @MaSP varchar(10), @tenSp nvarchar(30) exec spCursorLocal1; Set @STT=3 Fetch next From cProdLocal into @masp,@tenSP; While (@@Fetch_Status=0) Hien 02 b-ghi dau Begin Print 'STT:='+ cast(@STT as varchar(4))+';Ma san pham := '+@masp +';Ten san pham := ' +@TenSP Fetch next From cProdLocal into @masp,@tenSP; set @STT=@STT+1 End close cProdLocal deallocate cProdLocal exec spCursorLocal2 10 Phạm vi họat động của biến contrỏ 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. [...]... đó những thay đổi dữliệu trong bảng gốc không có tác động đến con trỏ; • Contrỏ static không cho phép cập nhật dữliệu • Xem xét kịch bản (Lecture8-StaticCursor.sql): – Tạo contrỏ Static – hiển thị dữliệu trong contrỏ – 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 contrỏ (kiểm tra sự thay đổi của dữ liệu? ) 13 Contrỏ Keyset • Tập dữliệu trong khóa được... động của biến contrỏ 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 11 Phân loại contrỏ • Static - contrỏ tĩnh • Keyset – contrỏ keyset • Dynamic – contrỏ động 12 Static cursor • Khi contrỏ này được tạo ra, những mẫu tin được copy vào một bảng tạm thời trong CSDL tempdb; • Contrỏ làm việc... ngay lập tức đến contrỏ Dynamic • Xem kịch bản trong Lecture8-Dynamic.sql: – Tạo contrỏ Dynamic – Hiển thị dữliệu – Sửa, thêm dữliệu bảng gốc – Hiện thị dữ liệu trong contrỏ một lần nữa 16 Thay đổi dữliệu tại vị trí contrỏ • Có thể sử dụng Update hoặc Delete để sửa đổi hoặc xóa bản ghi tại vị trí hiện thởi của contrỏ với mệnh đề Where current of TEN _CURSOR • Chỉ áp dụng với contrỏ dạng KeySet... Tạo contrỏ KeySet – hiển thị dữ liệu trong contrỏ – 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 contrỏ (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 15 Dynamic cursor • Contrỏ 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 contrỏ keyset, dynamic không yêu cầu unique index... • Tập dữliệu trong khóa phải duy nhất • Cho phép thay đổi các trường dữliệu không phải là khóa • Việc thay đổi các trường nonkey sẽ có tác động ngay đến contrỏ • Việc xóa bản ghi hoặc thay đổi khóa có thể làm contrỏ bị lỗi • Việc thêm mới bản ghi vào bảng gốc không tác động đến contrỏ 14 Contrỏ Keyset (2) • Xem xét kịch bản (Lecture8-KeySetCursor.sql): – Tạo contrỏ KeySet – hiển thị dữliệu trong... sử dụng Update hoặc Delete để sửa đổi hoặc xóa bản ghi tại vị trí hiện thởi của contrỏ với mệnh đề Where current of TEN _CURSOR • Chỉ áp dụng với contrỏ dạng KeySet và Dynamic • Xem Lecture8-CurrentOfCursor.sql 17 . 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. (Lecture8-StaticCursor.sql): – Tạo con trỏ Static – 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ự. (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ự