
SQL Server 2000 : S d ng bi n ki u d li u Cursorử ụ ế ể ữ ệ
– Ph n 1ầ
Ph n l n các c s d li u quan h th ng làm vi c trênầ ớ ơ ở ữ ệ ệ ườ ệ
d li u c a nhi u dòng m u tin, còn g i là m t b các m uữ ệ ủ ề ẫ ọ ộ ộ ẫ
tin. Ví d l nh SELECT k t qu luôn tr v nhi u dòng dụ ệ ế ả ả ề ề ữ
li u h n là m t dòng d li u.ệ ơ ộ ữ ệ
Ng c l i đ i v i m t s ngôn ng l p trình ho c bên trongượ ạ ố ớ ộ ố ữ ậ ặ
các ng d ng thì ng i l p trình v n còn các thói quen x lýứ ụ ườ ậ ẫ ử
và tính toán d li u trên t ng dòng riêng l . Đ đáp ng đ c yêu c u này c a cácữ ệ ừ ẻ ể ứ ượ ầ ủ
ng i l p trình, mu n làm vi c ch trên t ng dòng d li u t i th i đi m hi n hành,ườ ậ ố ệ ỉ ừ ữ ệ ạ ờ ể ệ
Microsoft SQL Server t o ra m t ki u d li u đó chính là ki u cursor.ạ ộ ể ữ ệ ể
1/- Khái ni m v cursor :ệ ề
B n có th hình dung ki u d li u cursor (ki u con tr ) gi ng nh m t cu n s danhạ ể ể ữ ệ ể ỏ ố ư ộ ố ổ
b ch a thông tin liên l c c a các khách hàng giao d ch trong m t công ty. B ng cáchạ ứ ạ ủ ị ộ ằ
dò tìm th công, b n s ph i s d ng đ n m t và tay đ tham chi u đ n tên c a cácủ ạ ẽ ả ử ụ ế ắ ể ế ế ủ
khách hàng b t bỳ trong s danh b đó. B n có th di chuy n lên, xu ng ho c quaấ ổ ạ ạ ể ể ố ặ
trang đ tìm ra các khách hàng mong mu n, nh ng t i th i đi m hi n hành tay và m tể ố ư ạ ờ ể ệ ắ
c a b n ch đ ng t i m t khách hàng mà thôi.ủ ạ ỉ ứ ạ ộ
Ho t đ ng c a ki u d li u cursor trong Transaction-SQL hoàn toàn gi ng nh ví dạ ộ ủ ể ữ ệ ố ư ụ
minh h a trên. Tuy nhiên, cursor có nhi u ki u khác nhau cho phép b n có th ch nọ ở ề ể ạ ể ọ
l a đ đ nh nghĩa theo đúng yêu c u mà mình mong mu n. Tùy thu c vào ki u cursorự ể ị ầ ố ộ ể
đã đ nh nghĩa mà vi c đ c và c p nh t d li u s có hi u l c nh th nào.ị ệ ọ ậ ậ ữ ệ ẽ ệ ự ư ế

So sánh c ch cursor và b các m u tinơ ế ộ ẫ
2/- Các b c s d ng ki u d li u cursor :ướ ử ụ ể ữ ệ
Đ i v i các ki u d li u thông th ng sau khi khai báo bi n cùng v i ki u d li uố ớ ể ữ ệ ườ ế ớ ể ữ ệ
thích h p, b n s đ c phép gán giá tr c n l u tr vào bên trong bi n. Ho t đ ng c aợ ạ ẽ ượ ị ầ ư ữ ế ạ ộ ủ
bi n ki u d li u cursor hoàn toàn không đ n gi n nh th , đ s d ng đ c bi nế ể ữ ệ ơ ả ư ế ể ử ụ ượ ế
ki u d li u cursor, b n ph i th c hi n m t cách th t qua nhi u b c khác nhau.ể ữ ệ ạ ả ự ệ ộ ứ ự ề ướ
Chi ti t các b c th c hi n khi s d ng bi n ki u d li u cursor trong Transaction-ế ướ ự ệ ử ụ ế ể ữ ệ
SQL. Đ làm vi c v i bi n có ki u cursor, b n ph i th c hi n t ng b c nh sau :ể ệ ớ ế ể ạ ả ự ệ ừ ướ ư
• Đ nh nghĩa bi n ki u cursor b ng l nh DECLARE.ị ế ể ằ ệ
• S d ng l nh OPEN đ m ra cursor đã đ nh nghĩa tr c đó.ử ụ ệ ể ở ị ướ
• Đ c và x lý trên t ng dòng d li u bên trong cursor.ọ ử ừ ữ ệ
• Đóng cursor l i b ng l nh CLOSE và DEALLOCATE.ạ ằ ệ
2.1/- Đ nh nghĩa bi n có ki u cursor :ị ế ể
Vi c đ nh nghĩa bi n có ki u cursor trong Transaction-SQL là vi c ch đ nh đ n nh ngệ ị ế ể ệ ỉ ị ế ữ
dòng d li u có bên trong các b ng d li u nào mà bi n s tham chi u đ n. Thôngữ ệ ả ữ ệ ế ẽ ế ế
th ng trong l nh đ nh nghĩa bi n có ki u cursor bên d i s ch đ nh ra lo i c aườ ệ ị ế ể ướ ẽ ỉ ị ạ ủ
cursor cho các m c đích s d ng v sau này thu n ti n h n.ụ ử ụ ề ậ ệ ơ
Cú pháp :

Trong đó :
• Tên cursor : tên c a bi n ki u cursor.ủ ế ể
• T khóa LOCAL\GLOBAL :ừ dùng ch đ nh ph m vi ho t đ ng c a bi n cursorỉ ị ạ ạ ộ ủ ế
ho c là c c b (local) bên trong m t th t c, lô (batch) các l nh, m t trigger ho c làặ ụ ộ ộ ủ ụ ệ ộ ặ
toàn c c (global) bên trong m t k t n i. M t bi n cursor có tính toàn c c s đ c phépụ ộ ế ố ộ ế ụ ẽ ượ
tham chi u trong b t kỳ th t c nào c a k t n i t o ra bi n cursor đó.ế ấ ủ ụ ủ ế ố ạ ế
• T khóa FORWARD_ONLY :ừ dùng ch đ nh vi c đ c d li u trong cursor ch theoỉ ị ệ ọ ữ ệ ỉ
chi u đi t i mà thôi (duy t t m u tin đ u tiên đ n m u tin cu i cùng).ề ớ ệ ừ ẫ ầ ế ẫ ố
• T khóa SCROLL :ừ dùng ch đ nh vi c đ c d li u trong cursor đ c phép diỉ ị ệ ọ ữ ệ ượ
chuy n t i lui, qua l i các dòng m u tin bên trong cursor tùy thích.ể ớ ạ ẫ
• T khóa STATIC :ừ dùng ch đ nh d li u đ c bên trong cursor là tĩnh. Khi đó n uỉ ị ữ ệ ọ ế
nh ng ng i dùng khác có các thay đ i bên d i d li u g c (base table) thì các thayữ ườ ổ ở ướ ữ ệ ố
đ i đó s không đ c c p nh t t đ ng trong d li u c a cursor. B i vì khi đó d li uổ ẽ ượ ậ ậ ự ộ ữ ệ ủ ở ữ ệ
trong cursor chính là d li u c a m t b ng t m đã đ c h th ng sao chép và l u trữ ệ ủ ộ ả ạ ượ ệ ố ư ữ
trong c s d li u tempdb c a h th ng khi đ ng nghĩa cursor.ơ ở ữ ệ ủ ệ ố ị
• T khóa DYNAMIC :ừ dùng ch đ nh d li u bên trong cursor là đ ng. Khi đó vi cỉ ị ữ ệ ộ ệ
c p nh t d li u trong b ng c s (base table) b i nh ng ng i dùng khác s đ cậ ậ ữ ệ ả ơ ở ở ữ ườ ẽ ượ
c p nh t t đ ng trong d li u cursor có ki u là DYNAMIC.ậ ậ ự ộ ữ ệ ể
• T khóa KEYSET :ừ có ho t đ ng g n gi ng v i ki u DYNAMIC, các thay đ i dạ ộ ầ ố ớ ể ổ ữ
li u trên các c t không là khóa chính trong b ng c s b i nh ng ng i dùng khác sệ ộ ả ơ ở ở ữ ườ ẽ
đ c c p nh t trong d li u cursor. Tuy nhiên đ i v i các m u tin v a thêm m i ho cượ ậ ậ ữ ệ ố ớ ẫ ừ ớ ặ
các m u tin đã b h y b b i nh ng ng i dùng khác s không đ c hi n th trong dẫ ị ủ ỏ ở ữ ườ ẽ ượ ể ị ữ
li u cursor có ki u là KEYSET.ệ ể
• T khóa READ_ONLY :ừ dùng ch đ nh d li u bên trong cursor là ch đ c nh mỉ ị ữ ệ ỉ ọ ằ
h n ch vi c s a đ i d li u bên trong cursor. Khi khai báo cursor v i ki u d li u làạ ế ệ ử ổ ữ ệ ớ ể ữ ệ
tĩnh (STATIC) thì d li u trong cursor xem nh là ch đ c.ữ ệ ư ỉ ọ

• T khóa SCROLL_LOCK :ừ dùng ch đ nh h th ng Microsoft SQL Server t đ ngỉ ị ệ ố ự ộ
khóa các dòng m u tin c n ph i thay đ i giá tr ho c b h y b bên trong b ng nh mẫ ầ ả ổ ị ặ ị ủ ỏ ả ằ
đ m b o các hành đ ng c p nh t luôn luôn thành công.ả ả ộ ậ ậ
• Câu l nh SELECT :ệ dùng đ ch đ n các c t có bên trong b ng mà b n c n đ c dể ỉ ế ộ ả ạ ầ ọ ữ
li u. Câu l nh SELECT trong cursor không th ch a các m nh đ : INTO, COMPUTE,ệ ệ ể ứ ệ ề
COMPUTE BY.
• Danh sách các c t c p nh t :ộ ậ ậ ch đ nh danh sách tên các c t s đ c phép thay đ iỉ ị ộ ẽ ượ ổ
giá tr trong cursor. M c đ nh t t c các c t trong m nh đ SELECT s đ c phép thayị ặ ị ấ ả ộ ệ ề ẽ ượ
đ i giá tr n u d li u cursor không ph i là ch đ c.ổ ị ế ữ ệ ả ỉ ọ
Ví d :ụ
Đ đ nh nghĩa m t bi n cursor ch a toàn b các dòng d li u bên trong b ng VATTU,ể ị ộ ế ứ ộ ữ ệ ả
các dòng d li u trong cursor cho phép đ c c p nh t. B n s d ng l nh khai báoữ ệ ượ ậ ậ ạ ử ụ ệ
bi n cursor nh sau :ế ư
Ví d :ụ
Đ đ nh nghĩa m t bi n cursor ch a toàn b các dòng d li u bên trong b ng NHACC,ể ị ộ ế ứ ộ ữ ệ ả
các d li u trong cursor ch đ c phép đ c và vi c đ c d li u trong cursor ch theoữ ệ ỉ ượ ọ ệ ọ ữ ệ ỉ
m t chi u t i. B n s d ng l nh khai báo bi n cursor nh sau :ộ ề ớ ạ ử ụ ệ ế ư
Nh n xét :ậ ví d trên, b n có th b đi t khóa READ_ONLY b i vì b n thân tở ụ ạ ể ỏ ừ ở ả ừ
khóa STATIC đã đ nh nghĩa d li u c a cursor là ch đ c. Tuy nhiên b n nên ghi nh ýị ữ ệ ủ ỉ ọ ạ ớ
nghĩa c a t ng t khóa riêng l đ đ nh nghĩa ra d li u c a các cursor đúng v i yêuủ ừ ừ ẻ ể ị ữ ệ ủ ớ
c u mà mình c n s d ng.ầ ầ ử ụ
2.2/- M cursor :ở
Đ có th đ c đ c các dòng d li u bên trong cursor tr c tiên b n c n ph i mể ể ọ ượ ữ ệ ướ ạ ầ ả ở
cursor ra b ng l nh OPEN. Ho t đ ng bên trong c a l nh này th c ra là h th ng sằ ệ ạ ộ ủ ệ ự ệ ố ẽ

th c hi n câu l nh truy v n SELECT đã đ c ch đ nh trong l nh đ nh nghĩa bi nự ệ ệ ấ ượ ỉ ị ệ ị ế
cursor tr c đó.ướ
Trong tr ng h p n u b n đ nh nghĩa s d ng cursor v i ki u STATIC ho c KEYSETườ ợ ế ạ ị ử ụ ớ ể ặ
thì h th ng s t o ra b ng t m ch a các d li u k t qu c a l nh SELECT n mệ ố ẽ ạ ả ạ ứ ữ ệ ế ả ủ ệ ằ
trong c s d li u tempdb. Cú pháp l nh OPEN nh sau :ơ ở ữ ệ ệ ư
Trong đó :
• Tên cursor : tên c a bi n ki u cursor đã đ nh nghĩa tr c đó b ng l nh DECLARE.ủ ế ể ị ướ ằ ệ
Ví d :ụ
Đ m các cursor đã đ nh nghĩa các ví d trên. B n s d ng l nh OPEN nh sau :ể ở ị ở ụ ạ ử ụ ệ ư
Ho cặ
SQL Server 2000 : S d ng bi n ki u d li u Cursorử ụ ế ể ữ ệ
– Ph n cu iầ ố
Sau khi đ nh nghĩa và m bi n cursor, hành đ ng k ti pị ở ế ộ ế ế
mà b n th ng th c hi n là vi c đ c và x lý d li u trongạ ườ ự ệ ệ ọ ử ữ ệ
cursor. B n s d ng l nh FETCH cùng v i các t khóa t ngạ ử ụ ệ ớ ừ ươ
ng đ ch đ nh vi c đ c các dòng d li u bên trong cursorứ ể ỉ ị ệ ọ ữ ệ
theo m t th t nào.ộ ứ ự
2.3/- Đ c và x lý d li u trong cursor :ọ ử ữ ệ
Cú pháp :
Trong đó :