十七、游标
一、什么是游标?
游标是一种能从包含多个元组的集合中每次读取一个元组的机制。游标总是和一段SELECT语句关联,
SELECT语句查询出的结果集就作为集合,游标能每次从该集合中读取出一个元组进行不同操作。
二、游标的核心价值
1. 将游标定位在结果集特定元组。
2. 将游标指定结果集中的元组数据读出。
3. 利用循环读取结果集中的多个元组数据。
4. 对游标指定结果集的元组进行数据修改。
5. 为其它用户设置结果集数据的更新限制。
6. 提供脚本、存储过程和触发器中访问结果集中数据的TSQL语句
三、游标的基本使用
声明游标
DECLARE cursor_name CURSOR [INSENSITIVE] [SCROLL] CURSOR FOR <SELECT语句> [FOR READ ONLY|UPDATE[OF <列名>[,...n]]]
INSENSITIVE:定义游标所选出的结果集存放在一个临时表,对该游标的读取操作都有该临时表来应
答。游标不会随着基本表内容的改变而改变,同时也无法通过游标来更新基本表。如果不使用该关键
字,对基本表的更新、删除都会反应到游标中。
SCROLL:指定游标使用的读取选项,默认值为NEXT,如果不使用该关键字,那么读取游标只能进行
NEXT操作,如果使用该关键字,那么游标向任何方向,或者任何位置移动,进行NEXT、LAST、
FIRST、PRIOR、RELATIVE n、ABSULUTE n操作。
FOR READ ONLY:表示定义游标为只读游标,不允许使用UPDATE、DELETE语句更新游标内的数据。
UPDATE[OF <类名>[,...n]]:指定游标内可以更新的列,如果有指定要更新的列,则表明所有列都允
许更新。
打开游标
OPEN [LOCAL|GLOBAL] cursor_name;
读取游标
FETCH [NEXT|PRIOR|FIRST|LAST |ABSLUTE n|@nvar] |RELATIVE n|@nvar] FROM [GLOBAL]cursor_name INTO[@nvar1,...n]
关闭游标
在处理完结果集中数据之后,必须关闭游标来释放结果集
CLOSE cursor_name
释放游标
游标使用不再需要之后,需要释放游标,以获取与游标有关的一切资源。
DEALLOCATE cursor_name
游标系统白能量与函数
游标系统变量与函数返回有关游标的信息。
@@CURSOR_NUM
返回最后打开的游标中满足条件的元组数
@@FETCH_STATUS
返回上次执行FETCH命令的状态
CURSOR_STATUS('GLOBAL|LOCAL','cursor_name')
用于确定是否返回游标和结果集
利用游标修改和删除表数据
可以通过游标来UPDATE修改或删除DELETE表中的当前数据行。
--修改数据 UPDATE table_name SET column_name=value|expression WHERE CURRENT OF cursor_name --删除数据 DELETE FROM table_name WHERE CURRENT OF cursor_name