-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path23.Cursor.sql
More file actions
89 lines (76 loc) · 2.8 KB
/
23.Cursor.sql
File metadata and controls
89 lines (76 loc) · 2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use DBTEST
create table Member
(
MemberId int primary key identity(1,1),
MemberAccount nvarchar(20) unique check(len(MemberAccount) between 6 and 12),
MemberPwd nvarchar(20),
MemberNickname nvarchar(20),
MemberPhone nvarchar(20)
)
insert into Member(MemberAccount,MemberPwd,MemberNickname,MemberPhone)
values('liubei','123456','Liu Bei','4659874564')
insert into Member(MemberAccount,MemberPwd,MemberNickname,MemberPhone)
values('guanyu','123456','Guan Yu','42354234124')
insert into Member(MemberAccount,MemberPwd,MemberNickname,MemberPhone)
values('zhangfei','123456','Zhang Fei','41253445')
insert into Member(MemberAccount,MemberPwd,MemberNickname,MemberPhone)
values('zhangyun','123456','Zhao Yun','75675676547')
insert into Member(MemberAccount,MemberPwd,MemberNickname,MemberPhone)
values('machao','123456','Ma Chao','532523523')
--Cursor: A database object used to process one row at a time
--Cursor types:
--1. Static cursor: Data doesn't change when cursor is opened
--2. Dynamic cursor: Data changes when cursor is opened (default)
--3. Keyset-driven cursor: Detects row changes but not column changes
select * from Member
--Declare cursor (scroll: allows bidirectional movement)
declare mycur cursor scroll
for select MemberAccount from Member
--Open cursor
open mycur
--Fetch specific rows
fetch first from mycur --First row
fetch last from mycur --Last row
fetch absolute 1 from mycur --Absolute position from start (nth row)
fetch relative 3 from mycur --Relative position from current (n rows)
fetch next from mycur --Next row from current
fetch prior from mycur --Previous row from current
--Use cursor data in query
declare @acc varchar(20)
fetch relative 3 from mycur into @acc
select * from Member where MemberAccount = @acc
--Iterate through cursor
declare @acc varchar(20)
fetch absolute 1 from mycur into @acc
--@@fetch_status:0 success, -1 failure, -2 row missing
while @@FETCH_STATUS = 0
begin
print 'Fetch success: ' + @acc
fetch next from mycur into @acc
end
--Update and delete using cursor
select * from Member
fetch absolute 2 from mycur
update Member set MemberPwd = '654321' where current of mycur
fetch absolute 2 from mycur
delete from Member where current of mycur
--After deletion, need to reopen cursor
select * from Member
--Declare cursor with multiple columns and iterate
declare mycur cursor scroll
for select MemberAccount, MemberPwd, MemberNickName from Member
open mycur
declare @acc varchar(20)
declare @pwd varchar(20)
declare @nickname varchar(20)
fetch absolute 1 from mycur into @acc,@pwd,@nickname
--@@fetch_status:0 success, -1 failure, -2 row missing
while @@FETCH_STATUS = 0
begin
print 'Username: ' + @acc + ', Password: ' + @pwd + ', Nickname: ' + @nickname
fetch next from mycur into @acc,@pwd,@nickname
end
--Close cursor
close mycur
--Deallocate cursor
deallocate mycur