SQL Server之游标
Posted chenloveslife
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server之游标相关的知识,希望对你有一定的参考价值。
部分参考自:https://www.cnblogs.com/knowledgesea/p/3699851.html
一、什么是游标
游标是取用一组数据并能够一次与一个单独的记录进行交互的方法,可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据。有时,确实不能通过在整个行集中修改或者甚至选取数据来获得所需要的结果,故需要逐一进行处理。
主要用处(存储过程):
- 定位到结果集中的某一行。
- 对当前位置的数据进行读写。
- 可以对结果集中的数据单独操作,而不是整行执行相同的操作。
- 是面向集合的数据库管理系统和面向行的程序设计之间的桥梁。
二、游标的生命周期:
- 声明游标
- 打开游标
- 使用或导航游标
- 关闭游标
- 释放游标
三、游标的使用
1. 声明游标
语法:
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF column_name [ ,...n ] ] ]
参数说明:
- cursor_name:游标名称。
- Local:作用域为局部,只在定义它的批处理,存储过程或触发器中有效。
- Global:作用域为全局,由连接执行的任何存储过程或批处理中,都可以引用该游标。
- [Local | Global]:默认为local。
- Forward_Only:指定游标智能从第一行滚到最后一行。Fetch Next是唯一支持的提取选项。如果在指定Forward_Only是不指定Static、KeySet、Dynamic关键字,默认为Dynamic游标。如果Forward_Only和Scroll没有指定,Static、KeySet、Dynamic游标默认为Scroll,Fast_Forward默认为Forward_Only
- Static:静态游标
- KeySet:键集游标
- Dynamic:动态游标,不支持Absolute提取选项
- Fast_Forward:指定启用了性能优化的Forward_Only、Read_Only游标。如果指定啦Scroll或For_Update,就不能指定他啦。
- Read_Only:不能通过游标对数据进行删改。
- Scroll_Locks:将行读入游标是,锁定这些行,确保删除或更新一定会成功。如果指定啦Fast_Forward或Static,就不能指定他啦。
- Optimistic:指定如果行自读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。当将行读入游标时,sqlserver不锁定行,它改用timestamp列值的比较结果来确定行读入游标后是否发生了修改,如果表不行timestamp列,它改用校验和值进行确定。如果已修改改行,则尝试进行的定位更新或删除将失败。如果指定啦Fast_Forward,则不能指定他。
- Type_Warning:指定将游标从所请求的类型隐式转换为另一种类型时向客户端发送警告信息。
- For Update[of column_name ,....] :定义游标中可更新的列。
2. 打开游标
语法:
OPEN [ Global ] cursor_name | cursor_variable_name
3. 使用和导航游标
语法:
FETCH [ [Next|prior|Frist|Last|Absoute n|Relative n ] from ] [Global] cursor_name [into @variable_name[,....]]
参数说明:
- Frist:结果集的第一行
- Prior:当前位置的上一行
- Next:当前位置的下一行
- Last:最后一行
- Absoute n:从游标的第一行开始数,第n行。
- Relative n:从当前位置数,第n行。
- Into @variable_name[,...] : 将提取到的数据存放到变量variable_name中。
例如:FETCH NEXT FROM 游标名称 INTO 变量名1
意为发出第一个FETCH,即表明要检索特定记录的命令,并将该值放置在哪一个变量中。
每当提取一行时,就会更新@@FETCH_STATUS,通过检测全局变量@@Fetch_Status的值,获得提取状态信息。
其可能的值是:
0 Fetch语句成功——一切正常;
-1 Fetch语句失败——找不到记录(还没有到达游标的末尾,但自打开游标以后,记录已经被删除);
-2 Fetch语句失败——这一次是由于已经超出了游标中的最后一条(或者第一条)记录。
4. 关闭游标
游标打开后,服务器会专门为游标分配一定的内存空间存放游标操作的数据结果集,同时使用游标也会对某些数据进行封锁。所以游标一旦用过,应及时关闭,避免服务器资源浪费。
CLOSE [ Global ] cursor_name | cursor_variable_name
5. 释放游标
删除游标,释放资源
DEALLOCATE [ Global ] cursor_name | cursor_variable_name
四、游标使用实例:
DECLARE sc_cursor CURSOR FOR SELECT Grade FROM SC WHERE Cno=@course_cno OPEN sc_cursor FETCH NEXT FROM sc_cursor INTO @stu_grade IF(@@FETCH_STATUS<>0) PRINT ‘没有考该课程的学生‘ WHILE @@FETCH_STATUS=0 BEGIN IF(@stu_grade<60) SET @stu_ccount+=1 IF(@stu_grade>=60 AND @stu_grade<90) SET @stu_bcount+=1 IF(@stu_grade>=90 AND @stu_grade<=100) SET @stu_acount+=1 FETCH NEXT FROM sc_cursor INTO @stu_grade END CLOSE sc_cursor DEALLOCATE sc_cursor
以上是关于SQL Server之游标的主要内容,如果未能解决你的问题,请参考以下文章