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 m t b các m u
tin. 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 ườ
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 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
tìm th công, b n s ph i s d ng đ n m t tay đ tham chi u đ n tên c a các ế ế ế
khách hàng b t bỳ trong s danh b đó. B n 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 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 d ư
minh h a trên. Tuy nhiên, cursor nhi u ki u khác nhau cho phép b n th ch n
l a đ đ nh nghĩa theo đúng yêu c u 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 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 nki u cursor trong Transaction-SQL 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 bi n s tham chi u đ n. Thông ế ế ế
th ng trong l nh đ nh nghĩa bi n 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 c c b (local) bên trong m t th t c, (batch) các l nh, m t trigger ho c
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 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 d li u c a m t b ng t m đã đ c h th ng sao chép 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 đ 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 : 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 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 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 ế
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 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 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 : d trên, b n th b đi t khóa READ_ONLY b i 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 :
Đ 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 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 m bi n cursor, hành đ ng k ti p ế ế ế
b n th ng th c hi n vi c đ c x 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 đó :