Cập nhật bằng con trỏ

Một phần của tài liệu Giao_trinh_SQL_server pptx (Trang 107 - 108)

Khi một con trỏ duyệt qua cỏc bộ của một bảng cơ sở (nghĩa là, một quan hệ được lưu trữ trong cơ sở dữ liệu chứ khụng phải là một khung nhỡn hoặc một quan hệ do một truy vấn tạo ra), thỡ người ta khụng chỉ cú thể đọc và xử lý giỏ trị của mỗi bộ, mà cũn cú thể cập nhật hoặc xúa cỏc bộ. Cỳ phỏp của những cõu lệnh UPDATE và DELETE đú giống như chỳng ta đó bắt gặp chương 1, ngoại trừ mệnh đề WHERE. Mệnh đề đú cú thể chỉ là WHERE CURRENT OF sau đú là tờn của con trỏ. Dĩ nhiờn chương trỡnh ngụn ngữ chủ cú thể đọc bộ để ỏp dụng một điều kiện nào đú mà nú muốn trước khi quyết định cú xúa hoặc cập nhật nú hay khụng.

Vớdụ 3.5: Trong Hỡnh 3.5 chỳng ta thấy một hàm C, hàm này xem xột mỗi bộ của NHÂNVIấN và quyết định hoặc là xúa bộ nếu lương nhỏ hơn 1000 hoặc là nhõn đụi giỏ trị Lương. Trong cỏc dũng (3) và (4) chỳng ta khai bỏo cỏc biến tương ứng với chớn thuộc tớnh của NHÂNVIấN, cựng với biến SQLSTATE. Sau đú, ở dũng (6), execCursor được khai bỏo để tự nú duyệt qua quan hệ được lưu trữ NHÂNVIấN. Ghi nhớ rằng, trong khi chỳng ta cú thể cố gắng sửa đổi cỏc bộ thụng qua một con trỏ duyệt qua một quan hệ tạm thời là kết quả của một truy vấn nào đú, thỡ chỳng ta chỉ cú thể cú một ảnh hưởng bền vững trờn cơ sở dữ liệu nếu con trỏ duyệt qua một quan hệ được lưu trữ chẳng hạn như NHÂNVIấN. Dũng (8) đến (14) là vũng lặp, ở đú con trỏ execCursor lần lượt tham chiếu đến từng bộ của NHÂNVIấN. Dũng (9) lấy ra bộ hiện hành đặt vào trong chớn biến được sử dụng cho mục đớch này; lưu ý rằng chỉ cú Luong1 được sử dụng thực sự. Dũng (10) kiểm tra xem chỳng ta đó lấy hết cỏc bộ của NHÂNVIấN hay chưa. Macro NO_MORE_TUPLES được sử dụng lại cho điều kiện biến SQLSTATE cú mó “khụng cũn tuple” “02000”.

Trong kiểm tra điều kiện ở dũng (11) chỳng ta hỏi lương cú dưới 1000 hay khụng. Nếu đỳng, bộ bị xúa do cõu lệnh DELETE của dũng (12). Ghi nhớ rằng mệnh đề WHERE tham chiếu con trỏ, vỡ thế bộ hiện thời của NHÂNVIấN, bộ mà chỳng ta vừa lấy được, bị xúa khỏi NHÂNVIấN. Nếu

lương ớt nhất là 1000 thỡ dũng (14), Lương trong bộ đú được thay thế bởi giỏ trị gấp đụi.

1) void ThaydoiLuong() {

2) EXEC SQL BEGIN DECLARE SECTION;

3) Char Họđệm1[20], Tờn1[15], MósốNV1[9], date ngaysinh1, Char Dịachỉ1[30], char Giớitinh1, Int Luong1,

4) char MósốNGS1[9], Int MósốĐV1, SQLSTATE[6]; 5) EXEC SQL END DECLARE SECTION;

6) EXEC SQL DECLARE execCursor CURSOR FOR NHÂNVIấN; 7) EXEC SQL OPEN execCursor;

8) While (1) {

9) EXEC SQL FETCH FROM execCursor INTO:Họđệm1,:Tờn1, : MósốNV1,:ngaysinh1,:Địachỉ1,:Giớitớnh1,:Luong1,:

MósụNGS1,:MósốĐV1 ;

10) if (NO_MORE_TUPLES) break;

11) if (Luong1 < 1000)

12) EXEC SQL DELETE FROM MovieExec

WHERE CURRENT OF execCursor; 13) else

14) EXEC SQL UPDATE MovieExec SET Lương = 2 * Lương WHERE CURRENT OF execCursor }

15) EXEC SQL CLOSE execCursor; }

Hỡnh 3.5: Sửa đổi lương của nhõn viờn

Một phần của tài liệu Giao_trinh_SQL_server pptx (Trang 107 - 108)