定义
游标是SQL 的一种数据访问机制。可以将游标简单的看成是查询的结果集的一个指针,可以根据需要在结果集上面来回滚动,浏览需要的数据。
游标的优势
优点:方便用户对数据库中的数据逐条进行处理
缺点:在进行大数据处理时,效率低下,占用的内存也比较大
使用
-
声明游标
DECLARE CURSOR <游标名>
FOR<SELECT-查询块>——使用SELECT查询块来定义一个游标。 -
打开游标
OPEN<游标名> -
提取游标
FETCH
[[NEXT|PRIOR|FIRST|LAST|ABSOLUTE n|RELATIVE n]FROM]
<游标名>
NEXT——如果是在OPEN后第一次执行FETCH命令,则返回结果集的第一行,否则使游标的指针指 向结果集的下一行,NEXT是默认的选项。 -
关闭游标
CLOSE<游标名> -
释放游标
DEALLOCATE<游标名>。
举例
表名:Customers
要求:修改消费等级(ConsumeLevel)这个字段,当消费金额(ConsumeAmount)>1000时,等级为高消费,500-1000包含500,不包含1000,等级为中消费,小于500 等级为低消费
--声明一个游标
declare cur_cust_level Cursor
for
select ID,ConsumAmount from Customers
--打开游标
open cur_cust_level
declare @id int
declare @Cacount int
fetch next from cur_cust_level into @id,@Cacount
--循环往下
while (@@FETCH_STATUS=0)
begin
--修改消费等级
if(@Cacount<500)
update Customers set Consumelevel='低消费' where id=@id
else if(@Cacount<1000)
update Customers set Consumelevel='中消费' where id=@id
else
update Customers set Consumelevel='高消费' where id=@id
fetch next from cur_cust_level into @id,@Cacount
end
--关闭游标
close cur_cust_level
--释放游标
deallocate cur_customer
@@FETCH_STATUS:
0 FETCH 语句成功
-1 FETCH 语句失败或此行不在结果集中
-2 被提取的行不存在
结果图
常见的游标使用
统计报表
计算每天的总消费金额,还是以上方的Customers表为例
新建一个统计表,表名Statis
declare cur_statis Cursor
for
select year(ConsumeTime) yy,Month(ConsumeTime) mm,DAY(ConsumeTime) dd,sum(ConsumAmount) yye from Customers
group by year(ConsumeTime),MONTH(ConsumeTime),DAY(ConsumeTime)
--存到一个表里面,一年存365条
--月报表
open cur_statis
--浏览数据并获取
declare @yy varchar(50)
declare @mm varchar(50)
declare @dd varchar(50)
declare @yye int
fetch next from cur_statis into @yy,@mm,@dd,@yye
while (@@FETCH_STATUS=0)
begin
insert into statis values(@yy,@mm,@dd,@yye)
fetch next from cur_statis into @yy,@mm,@dd,@yye
end
close cur_statis
deallocate cur_statis