在使用SELECT查询数据库的时候,得到的是一个结果集,可能是0行,也可能是多行,如果我们要逐行,或者前进一行,后退一行进行处理,我们就可以使用游标。游标类似一个指针,可以从结果集的当前位置检索一行或多行,并进行数据修改。
首先来看下游标的使用过程:
--1.使用DECLARE CURSOR声明游标
--2.使用OPEN打开游标
--3.使用FETCH 取得某行数据
--4.使用CLOSE关闭游标
--5.使用DEALLOCATE释放游标
大致的过程就是这样,下面来看看每步具体的内容。
游标的声明
1 | DECLARE 游标名称 [INSENSITIVE] [SCROLL] CURSOR |
2 | FOR |
3 | SELECT 。。。 |
4 | [FOR {READ ONLY|UPDATE [OF 列]}] |
--INSENSITIVE 设置此属性,游标对此数据进行提取操作时返回的数据部反应基表的操作,游标不准许修改。
--SCROLL 常用在数据浏览上。
--READ ONLY 设置游标只读,不能修改
--UPDATE 设置游标内可以更新的列
打开游标
1 | OPEN {{GLOBAL}游标名称} |
如果指定GLOBAL,则该游标使用于所有的存储过程,触发器。
提取行
1 | FETCH NEXT | PRIOR | FIRST | LAST | ABSOLUTE | RELATIVE [数值|数值变量] |
2 | FROM 游标名称 INTO 变量1[,....n] |
--NEXT:取得当前数据行的下一行。如果是对游标的第一次提取操作,则读取结果集中的第一行,如果当游标已经指向结果集中的最后一行,再执行FETCH命令,则@@FETCH_STATUS值会变为-1,所以可以以@@FETCH_STATUS来判断当前状态。
--PRIOR:读取当前数据行的前一行。如果游标当前行指向第一行数据,则@@FETCH_STATUS值会变为-1。
--FIRST:读取游标第一行的数据。
--LAST: 读取游标最后一行的数据。
--ABSOLUTE [n|@n]:读取游标的第n行数据。如果n或@n为正,则返回从游标头开始的第n行数据,并将返回的行做为新的当前行。如果为负,则返回从游标尾开始的前n行数据,并将返回行做为新的当前行。如果为0,没有变化。
--RELATIVE [n|@n]:如果n或@n为正,则读取游标当前行的后面第n行数据,如果为负责读取当前行的前n行数据,如果为0 无变化。n必须为整数,@n必须为smallint,tinyin或int
关闭游标
1 | CLOSE 游标名称 |
释放游标
1 | DEALLOCATE 游标名称 |
在使用游标过程中,我们使用@@FETCH_STATUS 函数来获取FETCH语句的状态,当函数值为0,表示FETCH读取成功。当值为-1时,表示读取失败或者超出读取范围。当值为-2,表示读取行不存在。
下面我门来看看游标的具体使用。
有一个表T_User,通过游标取得T_User表中每一行,将每个人的年龄相加。
FUserName | FAge |
Tom | 20 |
Jack | 23 |
Lily | 25 |
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
2 DECLARE @Total INT
3 DECLARE @Age INT
4
5 SET @Total = 0
6
7 -- 声明游标
8 DECLARE MyCursor CURSOR
9 FOR
10 SELECT FAge FROM T_User
11
12 -- 打开游标
13 OPEN MyCursor
14
15 -- 提取数据
16 FETCH NEXT FROM MyCursor INTO @Age
17 WHILE @@FETCH_STATUS = 0
18 BEGIN
19 -- 把当前行的FAge列的值加到@Total变量上
20 SET @Total = @Total + @Age
21
22 -- 取得下一行,要是没有这句,会进入死循环
23 FETCH NEXT FROM MyCursor INTO @Age
24 END
25
26 -- 关闭游标
27 CLOSE MyCursor
28
29 -- 释放游标
30 DEALLOCATE MyCursor
31
32 -- 取得@Total的值
33 SELECT @Total
最后得到结果为68。
以上是对游标的初步了解,更多关于游标的内容以后继续。这只是把初学游标的理解写在这,欢迎评论和批评