View và Các Con Trỏ (Hướng dẫn thực hành)
Trang 1Chương 12 View và Các Con Trỏ (Hướng dẫn thực hành)
Mục đích
Hoàn thành chương này bạn có thể:
Tạo ra view sử dụng chương trình Enterprise Manager hoặc cú pháp T-SQL
Sửa đổi view sử dụng Enterprise Manager
Đổi tên view sử dụng Enterprise Manager
Tạo ra các kiểu con trỏ khác nhau
Thực thi nhiều tác vụ khác nhau với các con trỏ
Sửa đổi dữ liệu bằng các con trỏ
Đóng và giải phóng các con trỏ
Các bước thực hành trong chương này đã được mô tả chi tiết và dễ hiểu, để thực hiện được học viên cần nắm được mục đích của chương và hiểu được cách sử dụng các công cụ Hãy chú ý làm theo các bước sau:
Phần I – Hướng dẫn Thời gian : 1 tiếng 30 phút 12.1 Views (hay các khung nhìn)
Các view là các bảng dữ liệu ảo được định nghĩa bằng một câu truy vấn Một view không tồn tại vật lý như các tập hợp dữ liệu lưu trữ trong cơ sở dữ liệu Tuy nhiên, nó giống như một bảng dữ liệu thực với tập hợp các hàng, các cột dữ liệu Dữ liệu của View nhận được
từ các bảng thực trong cơ sở dữ liệu bằng việc định nghĩa câu truy vấn SQL
12.1.1 Tạo ra View
View có thể được tạo ra bằng cách chọn ra dữ liệu từ nhiều bảng bằng câu lệnh SELECT Cũng giống như các đối tượng dữ liệu khác, view phải được gán bởi một tên duy nhất trong cơ sở dữ liệu Câu lệnh CREATE VIEW được sử dụng để tạo ra một view trong trình Query Analyzer View còn có thể được tạo ra sử dụng chức năng Create View Wizard có trong Enterprise Manager Chúng ta cùng xem các bước thực hiện khi dùng trình Create View Wizard:
1 Nháy đúp chuột vào cơ sở dữ liệu Northwind.
Một danh sách các đổi tượng trong cơ sở dữ liệu Northwind được hiển thị
2 Nháy chuột vào biểu tường Run a Wizard trên thanh công cụ hoặc có thể nháy
chuột vào Tools trên menu và chọn chức năng Wizards từ menu đổ xuống.
3 Mở rộng lựa chọn Database.
Một danh sách các chức năng được hiển thị
4 Chọn chức năng Create View Wizard Nhấn nút OK
Trang 2Chương trình Create View Wizard xuất hiện.
5 Nhấn nút Next.
6 Chọn cơ sở dữ liệu Northwind từ danh sách Database name và nhấn nút Next.
7 Trong cột Include in View, nhấn chuột đánh dấu các ô sáng bên cạnh các bảng
Orders và Order Details để chọn chúng.
8 Nhấn nút Next.
9 Trong cột Select Column, nhấn chuột đánh dấu các ô sáng tương ứng với cột
OrderDate của bảng Orders, và các cột OrderID, ProductID và Quantity của bàng Order Details.
10 Nhấn nút Next.
Cửa sổ Define Restriction của chương trình xuất hiện Cửa sổ này có thể được sử dụng để
nhập vào các điều kiện ràng buộc dữ liệu Mệnh đề WHERE của câu lệnh SELECT có
thể được đưa ra ở đây
11 Gõ vào các dòng sau trong cửa sổ Define Restriction:
where "Order Details".orderid = Orders.orderid
and ProductID between 11 and 20
and CustomerID = 'BONAP'
12 Nhấn nút Next.
13 Gõ vào tên của view “Bonap_Orders_VIEW” Nhấn nút Next.
Lệnh tạo view được hiển thị như hình 12.1
Trang 3Hình 12.1: Create View Wizard
14 Nhấn nút Finish.
15 Hộp thoại Wizard Complete xuất hiện Nhấn nút OK.
view sẽ được hiển thị ở cửa sổ bên phải
12.1.2 Sửa đổi View
Một view có thể được sửa đổi bằng trình Enterprise Manager Chúng ta cùng sửa đổi
Bonap_Orders_VIEW để nó không hiển thị cột Quantity Các bước thực thi trong
Enterprise Manager như sau:
1 Nhấn chuột phải vào view Bonap_Orders_VIEW trong cơ sở dữ liệu Northwind.
Một danh sách các chức năng xuất hiện
2 Chọn Design View từ danh sách các chức năng.
Cửa sổ thiết kế view được hiển thị
3 Xoá đánh dấu trên ô sáng cạnh cột Quantity.
Việc sửa đổi thiết kê được hiển thị như hình 12.2
Trang 4Hình 12.2: Sửa đổi thiết kế của View
4 Nhấn nút save trên thanh công cụ trong cửa sổ thiết kế để ghi lại các thay đổi.
5 Nhấn nút close để thoát khỏi màn hình thiết kế.
12.1.3 Đổi tên View
Chúng ta có thể đổi tên của một view trong Enterprise Manager chẳng hạn đổi tên view
Bonap_Orders_VIEW thành Bonap_Orders Các bước thực hiện trong trình Enterprise
Manager như sau:
1 Nhấn chuột phải trên view Bonap_Orders_VIEW trong cơ sở dữ liệu Northwind.
Một danh sách các chức năng xuất hiện
2 Chọn chức năng Rename từ menu.
3 Đổi tên view thành Bonap_Orders.
Một hộp thoại xuất hiện như hình 12.3
Hình 12.3: Hộp thoại xác nhận việc đổi tên View
Trang 54 Nhấn nút Yes trong hộp thoại.
5 Nhấn nút OK trên hộp thoại thông báo việc đổi tên đã thành công.
View được đổi tên xuất hiện như hình 12.4
Hình 12.4: Đổi tên view 12.2 Các con trỏ
Trong một cơ sở dữ liệu quan hệ, một tác vụ thực hiện trên bảng chứa tất cả các hàng Câu lệnh SELECT trả về các hàng thoả mãn điều kiện đưa ra trong mệnh đề WHERE Nhưng một số ứng dụng, đặc biệt các ứng dụng tương tác, không thể làm việc với toàn bộ tập hợp các hàng Những ứng dụng này cần một số kỹ thuật để làm việc với một hàng, hoặc một tập con các hàng Con trỏ chính là sự mở rộng đối với tập hợp kết quả trả về nhằm cung cấp kỹ thuật để làm việc với một hàng tại một thời điểm
Một con trỏ là một đối tượng cơ sở dữ liệu mà các ứng dụng sử dụng để xử lý dữ liệu theo từng hàng Sử dụng câu lệnh T-SQL DECLARE CURSOR để định nghĩa các thuộc tính của một con trỏ T-SQL
12.2.1 Khai báo các con trỏ
Chúng ta cùng tạo ra một con trỏ để hiển thị title_id, title, price, và ytd_sales từ bảng titles cho các quyển sách có kiểu là ‘psychology’ Các bước tiến hành trong trình Query
Analyzer như sau:
1 Trong Query Analyzer, chọn cơ sở dữ liệu pubs.
2 Thực hiện đoạn lệnh sau:
DECLARE TitleCursor CURSOR
SCROLL
FOR
SELECT title_id, title, price, ytd_sales FROM titles
Trang 6WHERE type = 'psychology' Con trỏ đã được tạo ra
12.2.2 Mở các con trỏ
Sau khi khai báo con trỏ, chúng ta cần mở nó để truy nhập đến các hàng trong nó
1 Thực hiện lệnh sau:
OPEN TitleCursor
12.2.3 Truy xuất các hàng của con trỏ
Lệnh FETCH nhận về các hàng từ con trỏ và hiển thị nó trên màn hình Lệnh FETCH có rất nhiều tính năng hữu dụng
Ngầm định, một lệnh FETCH không kèm theo tuỳ chọn nào hiển thị các bản ghi ở vị trí con trỏ đến hàng logic hiên tại Do không có quá trình xử lý nào từ khi con trỏ được mở nên con trỏ này sẽ ở vị trí của bản ghi đầu tiên
1 Thực hiện lệnh sau:
FETCH TitleCursor
Kết quả của lệnh FETCH được hiển thị trong hình 12.5
Hình 12.5: Truy xuất các hàng của con trỏ
Bản ghi đầu tiên được hiển thị và hiện tại con trỏ trỏ đến hàng thứ hai
12.2.4 Truy xuất hàng đầu tiên
Bởi vì con trỏ ở hàng thứ hai nên để hiển thị hàng thứ nhất, chúng ta sử dụng tuỳ chọn FIRST của lệnh FETCH
1 Thực hiện lệnh sau:
FETCH FIRST FROM TitleCursor
Kết quả được hiển thị trong hình 12.6
Trang 7Hình 12.6: Truy xuất hàng đầu tiên của con trỏ 12.2.5 Truy xuất hàng tiếp theo
1 Thực hiện lệnh sau:
FETCH NEXT FROM TitleCursor
Kết quả hiển thị trong hình 12.7
Hình 12.7: Truy xuất hàng tiếp theo của con trỏ 12.2.6 Truy xuất hàng cuối cùng
1 Thực hiện lệnh sau:
FETCH LAST FROM TitleCursor
Kết quả hiển thị trong hình 12.8
Trang 8Hình 12.8: Truy xuất hàng cuối cùng của con trỏ 12.2.7 Truy xuất chính xác đến một hàng
Từ khoá ABSOLUTE được sử dụng để truy xuất đến một hàng xác định bởi số hiệu của
vị trí của nó trong con trỏ
1 Thực hiện lệnh sau:
FETCH ABSOLUTE 2 FROM TitleCursor
Kết quả hiển thị hàng thứ hai trong con trỏ, xem hình 12.9
Hình 12.9: Truy xuất một hàng xác định trong con trỏ 12.2.8 Truy xuất đến một hàng liên quan
Từ khoá RELATIVE sử dụng cùng lệnh FETCH để chỉ ra một vị trí có quan hệ với vị trí của bản ghi hiện tại
1 Thực hiện lệnh sau:
FETCH RELATIVE 1 FROM TitleCursor
Kết quả trong hình 12.10
Trang 9Hình 12.10: Truy xuất hàng liên quan trong con trỏ 12.2.9 Đóng con trỏ và giải phóng nó
Khi một con trỏ không được sử dụng đến nữa, nó nên được đóng lại và giải phóng khỏi
bộ nhớ Bây giờ chúng ta đóng và giải phóng con trỏ TitleCursor.
1 Thực hiện đoạn lệnh sau:
CLOSE TitleCursor
DEALLOCATE TitleCursor
12.2.10 Tạo con trỏ FORWARD_ONLY (Chỉ tiến)
Chúng ta khai báo một con trỏ FORWARD_ONLY để thay đổi dữ liệu của chính
nó.Con trỏ này bao gồm tất cả các bản ghi của bảng jobs mà có giá trị của trường min_lvl = 75 Sau đó thay đổi giá trị cột max_lvl của bản ghi đầu tiên = 100
1 Thực hiện đoạn lệnh sau ở trong Query Analyzer:
DECLARE JobsCursor CURSOR FORWARD_ONLY
FOR
SELECT * FROM jobs WHERE min_lvl = 75
FOR UPDATE
OPEN JobsCursor
FETCH JobsCursor
UPDATE jobs
SET max_lvl = 100 WHERE CURRENT OF JobsCursor WHERE CURRENT OF Cursor2
SELECT * FROM jobs WHERE min_lvl = 75
CLOSE JobsCursor
DEALLOCATE JobsCursor
Kết quả được hiển thị ở hình 12.11
Trang 10Hình 12.11 : Ví dụ về con trỏ FORWARD_ONLY Câu lệnh FETCH hiển thị nguyên bản bản ghi đầu tiên của con trỏ Trường Max_lvl đã
được thay đổi giá trị ở bản ghi đầu tiên, và sau đó câu lệnh SELECT hiển thị giá trị đã thay đổi đó
12.2.11 Tạo con trỏ READ_ONLY( chỉ đọc)
Bây giờ chúng ta tạo ra một con trỏ READ_ONLY, nó bao gồm các hàng của bảng
pub_info, các hàng này phải có giá trị của trường pub_id nằm trong khoảng 1000 đến
2000 Sau đó chúng ta sẽ thử xóa một hàng của con trỏ này và xem kết quả của nó
1 Thực hiện đoạn lệnh sau:
DECLARE PubInfoCursor CURSOR READ_ONLY
FOR
SELECT * FROM pub_info
WHERE pub_id between 1000 and 2000
OPEN PubInfoCursor
FETCH PubInfoCursor
DELETE FROM pub_info
WHERE CURRENT OF PubInfoCursor CLOSE PubInfoCursor
DEALLOCATE PubInfoCursor
Lệnh DELETE trả về một lỗi được hiển thị trong hình 12.12
Trang 11Hình 12.12: Ví dụ về con trỏ READ_ONLY Phần II – Bài tập Thời gian : 30 phút Hãy thực hiện các thao tác sau trong Query Analyzer sử dụng cơ sở dữ liệu Northwind
1 Tạo một View có tên là EmpHierarchy dựa trên bảng employees và sử dụng câu lệnh CREATE VIEW View bao gồm các trường employee ID, first name, last name, và first
name của người mà nhân viên đó làm báo cáo cho,
2 Trong View EmpHierarchy, thay đổi last name của bản ghi có trường the employee ID có
giá trị là 4 thành ‘Jones’ Sử dụng câu lệnh UPDATE để thay đổi dữ liệu của bảng
3 Xóa View EmpHierarchy sử dụng câu lệnh DROP VIEW
4 Tạo con trỏ SCROLL có tên là SuppliersCursor, con trỏ này chứa các bản ghi của các nhà cung cấp từ ‘UK’ và ‘USA’, lấy từ bảng Suppliers Mở con trỏ, hiển thị bản ghi đầu tiên và
bản ghi cuối cùng Đóng và giải phóng con trỏ khỏi bộ nhớ
Phần III – Bài tập về nhà
Thực hiện các thao tác sau trong Enterprise Manager, sử dụng cơ sở dữ liệu pubs:
1 Tạo một View có tên là Sales_View, Nó chứa dữ liệu từ bảng titleauthor, sales và titles.
View chứa các trường author ID, title ID, royalty percentage, store ID và số lượng bán được
của tác giả có ID là 724-80-9391.
Trang 12Thực hiện các thao tác sau trong Query Analyzer, sử dụng cơ sở dữ liệu pubs database:
2 Khai báo một con trỏ có chứa thông tin chi tiết về các nhân viên của nhà xuất bản có ID là
0877 Tăng thời hạn hợp đồng cho tất cả các nhân viên ở những bản ghi lẻ lên 1 năm Cuối cùng hiển thị tất cả các nhân viên của nhà xuất bản có ID là 0877 để kiểm tra những thay
đổi