博客很久没有更新了,原因是大多数时间都忙在研究技术上,却懒得腾时间出来把技术分享,最近在开源力量上开课《Mongodb管理与维护》,让屌丝们从0到精通,敬请关注。本博客技术原创更新滞后一些,找时间更新有关mysql,mongodb等内容,谢谢大家关注。
全部博文(75)
分类: 数据库开发技术
2011-02-16 09:51:50
1. 什么是游标
有三种水果放在大水果桶里,但我每次只需要吃其中一种,那么每吃一个水果都去大水果桶拿肯定不方便。怎么办?
我们可以这样来做,比如我要吃苹果,我从大的水果桶中拿出几个苹果放到小水果盆里,这样每次吃时取用就方便了。
在这里,水果桶就是数据表,那么这个盛苹果的小水果盆就是游标。它的作用就是选择大桶中的一部分水果放到小水果盆中临时放,便于取用。
2. 怎么声明游标的
也就是怎么使用水果盆的?
怎么从水果桶中拿出10个苹果?看下面语句:
Select top 10 苹果 from 水果桶 where Name=’苹果’;
怎么把10个苹果放到水果盆?看下面语句:
Declare 小水果盆 cursor for Select top 10 苹果 from 水果桶 where Name=’苹果’;
这样就实现了,把从水果桶中名字为’苹果’的水果放到小水果盆,这时候起到临时存放水果的小水果盆,我们就用一个专用的名词叫“游标”。那么怎么告诉系统使用了水果盆,并且让系统知道水果盆叫什么名字?使用下面语句:Declare 小水果盆 cursor
它的名字叫"小水果盆"
3. 如何使用游标
也就是拿水果放到水果盆后,水果盆还起到什么作用?
我们最终的目的是吃水果,假如水果盆是有盖的,
那么第一步就是先打开盖,怎么打开盖,看下面语句:
Open 小水果盆;
第二步:吃苹果往往把它放到一个碟子里,然后把皮去掉。我们把获取一个削了皮的苹果放到碟子里,这个过程叫做获取值。
怎么从水果盆获取一个苹果放到碟子里呢?看下面语句:
fetch next from 小水果盆 into @碟子
因为里面有多个,每次只能取一个,所以用fetch next from 小水果盆。这样就能吃到苹果了。
但我们有10个苹果,一个一个地吃,吃完后,就得收拾一下。
怎么收拾?
第三步:得盖上水果盆的盖子,怎么盖上的?看下面语句:
Close 小水果盆;
第四步:既然用完水果盆,就把它还回去,可能别人还要等着用呢,别占着。
Deallocate 小水果盆;
这就是释放小水果盆,把临时占用的内存资源还给系统,不再占用内存资源了。
这就是使用小水果盆的整个流程了,也就是使用游标的整个必须的流程。
二.游标实例与详细解答
@UserLastLogin datetime,--声明一个变量用来保存用户上次登录的时间
@UserID int ---声明一个变量用来保存用户的ID
declare curUserLast cursor for select UserID,UserLastLogin from dbo.huangxifeng_user where UserName='huangxifeng'; --(现在使用一个水果盆)游标变量curUserLast声明,取的数据是用户id和上次登录的时间,放到临时保存作用的curUserLast中
open curUserLast; --(现在打开水果盆盖)打开游标
fetch next from curUserLast into @UserID,@UserLastLogin ; --(从水果盆里拿一个水果到碟子里)每次获取一次游标值,并把获取的值放到变量@UserID,@UserLastLogin中
while(@@FETCH_STATUS=0) ---@@FETCH_STATUS=0表明游标的数据还没有取完(水果没吃完,就表明水果盆还在起作用),一旦游标取完数据,@@FETCH_STATUS<>0,即退出循环。
begin
update dbo.huangxifeng_user set UserInDate=convert(datetime,DATEADD(YEAR,-3,@UserLastLogin),20) where UserID=@UserID; ---用@UserID来更新相应的记录(拿来的水果是用来吃的,拿到的变量是用来用的。)
fetch next from curUserLast into @UserID,@UserLastLogin ; ---再获取游标的下一条记录(吃完一个,再拿下一个,如果拿到没有了,@@FETCH_STATUS<>0)
end
close curUserLast; --(用完后把盖子盖上)循环结束后,表明游标的值已经用完,关闭游标。
deallocate curUserLast; --(把水果盆还回去)释放游标
三.游标脚本调用
直接运行数据语句。
四.验证结果
select * from dbo.huangxifeng_user
huangxifeng6072011-08-16 15:13:54
OK
<script type="text/javascript" src="http://js.tongji.linezing.com/2579949/tongji.js"></script><noscript><a href="http://www.linezing.com"><img src="回复 | 举报