1.为何使用游标:
e+id@8`t&U;t0 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。51Testing软件测试网n9{)yh e{%O6z+HB
2.如何使用游标:
f$i8`/_9L{0 一般地,使用游标都遵循下列的常规步骤:
9W3r#aE H?0 (1) 声明游标。把游标与T-SQL语句的结果集联系起来。
k4m|!O$OY{0 (2) 打开游标。51Testing软件测试网8X/E'L#VQ4w
(3) 使用游标操作数据。51Testing软件测试网I)Ktko~tN
(4) 关闭游标。
;U{3Za,P02.1.声明游标51Testing软件测试网;B
n(Gu}
DECLARE CURSOR语句SQL-92标准语法格式:
Uh4@P7CZ+kn0 DECLARE游标名[ INSENSITIVE ] [ SCROLL ] CURSOR51Testing软件测试网)u9LP+FK9b G
ix.ya
FOR sql-statement51Testing软件测试网7g X.ea4FL4WT
Eg:51Testing软件测试网~$or?Y,]I(vf
Declare MycrsrVar Cursor
)vSWg&s+y*~#zPq0FOR Select * FROM tbMyData
!@!g1z(`-x#}1{3cw'X(I5f yk0 2.2 打开游标
(r'AUO;z3wY
H*h9BTK0OPEN MycrsrVar51Testing软件测试网4E7c6r6T,l9h0xZ9v.Q
当游标被打开时,行指针将指向该游标集第1行之前,如果要读取游标集中的第1行数据,必须移动行指针使其指向第1行。就本例而言,可以使用下列操作读取第1行数据:
$yUc"~T
H1[6x~0 FETCH FIRST from E1cursor
0chw7L2[&~0 或FETCH NEXT from E1cursor
$A(K dMA
b;Y0 2.3 使用游标操作数据
~6?/_x0j,`X;?C0下面的示例用@@FETCH_STATUS控制在一个WHILE循环中的游标活动
frd i5\#JhG,Nw0/*使用游标读取数据的操作如下。*/51Testing软件测试网^3Se#n#l
DECLARE E1cursor cursor /*声明游标,默认为FORWARD_ONLY游标*/
nwo"uK2O+PQ%k0FOR SELECT * FROM c_example
'Lx(m+Jchz
~^0OPEN E1cursor /*打开游标*/51Testing软件测试网:}{(tb
W
FETCH NEXT from E1cursor /*读取第1行数据*/51Testing软件测试网M~{\LORy:cj8K"@
WHILE @@FETCH_STATUS = 0 /*用WHILE循环控制游标活动*/51Testing软件测试网*k{nFxn9Bb/L J
BEGIN51Testing软件测试网nY-D.@c
FETCH NEXT from E1cursor /*在循环体内将读取其余行数据*/
$cwD*P2][:X d"k,{
m0END
}+Z^6Ae*bd0CLOSE E1cursor /*关闭游标*/
%DxjSmr0DEALLOCATE E1cursor /*删除游标*/51Testing软件测试网|h*qS\(kbL
2.4 关闭游标
Z0cPDF+s/S0 使用CLOSE语句关闭游标51Testing软件测试网d.aOL0UM3@
CLOSE { { [ GLOBAL ]游标名} |游标变量名}51Testing软件测试网)V:TQF(y7V
使用DEALLOCATE语句删除游标,其语法格式如下:51Testing软件测试网pD.H$a6F%`
DEALLOCATE { { [ GLOBAL ]游标名} | @游标变量名
BUDstr03. FETCH操作的简明语法如下:51Testing软件测试网^{*FeY)t6qE
FETCH51Testing软件测试网$e6N1AUE6xm_wI
[ NEXT | PRIOR | FIRST | LAST]51Testing软件测试网D ]6X(o
lk~
FROM51Testing软件测试网
L9v/V
llj Ji
{游标名 | @游标变量名} [ INTO @变量名[,…] ]
)zIL&zo
J0参数说明:51Testing软件测试网YF8]u6K8g
NEXT 取下一行的数据,并把下一行作为当前行(递增)。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH NEXT操作将取得游标集中的第1行数据。NEXT为默认的游标提取选项。
;M.bu/OTp0INTO @变量名[,…] 把提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。51Testing软件测试网?&o4x+v/K)a
每执行一个FETCH操作之后,通常都要查看一下全局变量@@FETCH_STATUS中的状态值,以此判断FETCH操作是否成功。该变量有三种状态值:51Testing软件测试网Z ZKO;fum/W
・ 0 表示成功执行FETCH语句。
,_MR"B$a^0・-1 表示FETCH语句失败,例如移动行指针使其超出了结果集。
)oK$b&P.H_~0 ・-2 表示被提取的行不存在。51Testing软件测试网{*X,\$o5b|*r
由于@@FETCH_STATU是全局变量,在一个连接上的所有游标都可能影响该变量的值。因此,在执行一条FETCH语句后,必须在对另一游标执行另一FETCH语句之前测试该变量的值才能作出正确的判断。51Testing软件测试网4XE5}9Q
a-V-w+@1n
51Testing软件测试网T/\FNI+Pk3l