Chinaunix首页 | 论坛 | 博客
  • 博客访问: 375941
  • 博文数量: 75
  • 博客积分: 1732
  • 博客等级: 上尉
  • 技术积分: 812
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-11 16:02
个人简介

博客很久没有更新了,原因是大多数时间都忙在研究技术上,却懒得腾时间出来把技术分享,最近在开源力量上开课《Mongodb管理与维护》,让屌丝们从0到精通,敬请关注。本博客技术原创更新滞后一些,找时间更新有关mysql,mongodb等内容,谢谢大家关注。

文章分类

全部博文(75)

文章存档

2021年(1)

2011年(20)

2010年(40)

2009年(7)

2008年(7)

分类: 数据库开发技术

2011-02-16 09:51:50

转载请注册出处 http://blog.chinaunix.net/space.php?uid=16909016&do=blog&id=121132 嬴政高级数据库技术


一、使用游标的步骤如下
我们先假设大水果桶装有香蕉、苹果、梨。
小水果盆日常用放少量水果的。

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 小水果盆;

这就是释放小水果盆,把临时占用的内存资源还给系统,不再占用内存资源了。

      这就是使用小水果盆的整个流程了,也就是使用游标的整个必须的流程。

.游标实例与详细解答


 

  declare

 

    @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


阅读(2991) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~