结果集,结果集就是select查询之后返回的所有行数据的集合。
游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据。
一般复杂的存储过程,都会有游标的出现,他的用处主要有:
根据游标检测结果集变化的能力和消耗资源的情况不同,SQL Server支持的API服务器游标分为一下4种:
静态游标在滚动时检测不到表数据变化,但消耗的资源相对很少。动态游标在滚动时能检测到所有表数据变化,但消耗的资源却较多。键集驱动游标则处于他们中间,所以根据需求建立适合自己的游标,避免资源浪费。。
游标的生命周期游标的生命周期包含有五个阶段:声明游标、打开游标、读取游标数据、关闭游标、释放游标。
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 ] ] ]
参数说明:
2.声明一个动态游标
declare orderNum_02_cursor cursor scrollfor select OrderId from bigorder where orderNum='ZEORD003402'
3.打开游标
--打开游标语法open [ Global ] cursor_name | cursor_variable_name
cursor_name:游标名,cursor_variable_name:游标变量名称,该变量引用了一个游标。
--打开游标open orderNum_02_cursor
4.提取数据
--提取游标语法Fetch[ [Next|PRior|Frist|Last|Absoute n|Relative n ]from ][Global] cursor_name[into @variable_name[,....]]
参数说明:
例子:
--提取数据fetch first from orderNum_02_cursorfetch relative 3 from orderNum_02_cursorfetch next from orderNum_02_cursorfetch absolute 4 from orderNum_02_cursorfetch next from orderNum_02_cursorfetch last from orderNum_02_cursor fetch prior from orderNum_02_cursorselect * from bigorder where orderNum='ZEORD003402'
结果(对比一下,就明白啦):
例子:
--提取数据赋值给变量declare @OrderId intfetch absolute 3 from orderNum_02_cursor into @OrderIdselect @OrderId as idselect * from bigorder where orderNum='ZEORD003402'
结果:
通过检测全局变量@@Fetch_Status的值,获得提取状态信息,该状态用于判断Fetch语句返回数据的有效性。当执行一条Fetch语句之后,@@Fetch_Status可能出现3种值:0,Fetch语句成功。-1:Fetch语句失败或行不在结果集中。-2:提取的行不存在。
这个状态值可以帮你判断提取数据的成功与否。
declare @OrderId intfetch absolute 3 from orderNum_02_cursor into @OrderIdwhile @@fetch_status=0 --提取成功,进行下一条数据的提取操作 begin select @OrderId as id fetch next from orderNum_02_cursor into @OrderId --移动游标 end
5.利用游标更新删除数据
--游标修改当前数据语法Update 基表名 Set 列名=值[,...] Where Current of 游标名--游标删除当前数据语法Delete 基表名 Where Current of 游标名
---游标更新删除当前数据---1.声明游标declare orderNum_03_cursor cursor scrollfor select OrderId ,userId from bigorder where orderNum='ZEORD003402'--2.打开游标open orderNum_03_cursor--3.声明游标提取数据所要存放的变量declare @OrderId int ,@userId varchar(15)--4.定位游标到哪一行fetch First from orderNum_03_cursor into @OrderId,@userId --into的变量数量必须与游标查询结果集的列数相同while @@fetch_status=0 --提取成功,进行下一条数据的提取操作 begin if @OrderId=122182 begin Update bigorder Set UserId='123' Where Current of orderNum_03_cursor --修改当前行 end if @OrderId=154074 begin Delete bigorder Where Current of orderNum_03_cursor --删除当前行 end fetch next from orderNum_03_cursor into @OrderId ,@userId --移动游标 end
6.关闭游标
游标打开后,服务器会专门为游标分配一定的内存空间存放游标操作的数据结果集,同时使用游标也会对某些数据进行封锁。所以游标一旦用过,应及时关闭,避免服务器资源浪费。
--关闭游标语法close [ Global ] cursor_name | cursor_variable_name--关闭游标close orderNum_03_cursor
7.删除游标
删除游标,释放资源
--释放游标语法deallocate [ Global ] cursor_name | cursor_variable_name--释放游标deallocate orderNum_03_cursor
新闻热点
疑难解答