论坛中所谓的“从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢” 读取 难道就是print么?如果不是为什么不用select一样可以读取再加上while也可以执行操作

转:

使用游标的步骤:

在使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的SELECT语句和游标选项。
一旦声明,就必须打开游标以供使用。这个过程用前面定义的SELECT语句把数据实际检索出来。
对于填有数据的游标,根据需要取出(检索)各行。
在结束游标使用时,必须关闭游标,可能的话,释放游标(有赖于具体的DBMS)。
声明游标后,可根据需要频繁地打开和关闭游标。在游标打开时,可根据需要频繁地执行取操作。

CLOSE语句用来关闭游标。一旦游标关闭,如果不再次打开,将不能使用。第二次使用它时不需要再声明,只需用OPEN打开它即可。

1.

游标用于按顺序遍历结果集。但一般情况下,应尽量避免使用游标。原因:1. 游标违背了关系模型,即按集合来考虑问题的思想;2. 游标逐行对纪录进行操作,会带来额外的开销,使用游标的解决方案通常比使用集合的解决方案要慢得多;3. 使用游标的解决方案,需要用很多代码来描述对游标的操作,因此代码更长,可读性更差,也更难以维护。

只有在少数情况下才应当使用游标。举两个例子:1. 需要遍历表名,进行DDL操作;2. 连续聚合,此时基于游标的解决方案可能比基于集合的解决方案更快。

2.概念:游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理
②特点:游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制
③作用:当需要逐条读取记录时可以用游标,相当于for循环,一次获取一条记录进行操作。当一组记录没有id字段时,此时用for循环不能够实现,而游标可以解决此问题(注:当数据量很大的时候不建议使用游标,因为游标处理处理数据比较慢)

3.游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。

一般是在需要对查询的结果集中的数据再进行二次处理才会用到。

4.标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标充当指针的作用。尽管游标能遍历结果中的所有行,但他一次只指向一行。

概括来讲,SQL的游标是一种临时的数据库对象,即可以用来存放在数据库表中的数据行副本,也可以指向存储在数据库中的数据行的指针。游标提供了在逐行的基础上操作表中数据的方法。

游标的一个常见用途就是保存查询结果,以便以后使用。游标的结果集是由SELECT语句产生,如果处理过程需要重复使用一个记录集,那么创建一次游标而重复使用若干次,比重复查询数据库要快的多。

大部分程序数据设计语言都能使用游标来检索SQL数据库中的数据,在程序中嵌入游标和在程序中嵌入SQL语句相同

5.
oracle里面判断游标是否到最后是游标属性%notfound,可以判断游标是否到最后,其他的数据库也应该有相应的属性吧,游标的作用就和指针类似,从一个结果集一步一步的读出数据,比如
select  * from table
查询结果是
1
2
3
我们可以用游标一步一步的提取1,再2,再3,这样赋值给一个变量。

6.
作用:通常情况下,关系数据库中的操作总是对整个记录集产生影响,例如使用SELECT语句检索数据表时,将得到所有满足该语句where子句中条件的记录,而在实际应用过程中,经常需要
每次处理一条或者一部分记录。在这种情况下,需要使用游标在服务器内部处理结果集合,他可
以有助于识别一个数据集合内部指定的记录,从而可以有选择的按记录执行操作。

7.
游标 其实就像是指针的东西 在你查询结果集的时候 游标是在第一条结果的前面 这样当你拨动游标的时候 他会向下移动一个位置 指向第二条记录 这样就会 读取出结果集中说有数据 比如 在C#中的read()方法 和java中的 next() 都是拨动游标的方法 我说的可能不太形象 楼主可以把它当做链表的指针 呵呵 楼主看看这里比较详细 

8.游标可以从数据库中查询出一个结果集,在你关闭它之前,你可以反复使用这个结果集,读取这个结果集中的任意行任意字段的内容,一般在存储过程或前台程序中常见。

 

 

 

9.游标
关系数据库中的操作会对整个行集产生影响。由 SELECT 语句返回的行集包括所有满足该语句 WHERE 子句中条件的行。由语句所返回的这一完整的行集被称为结果集。应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的结果集扩展。

游标通过以下方式扩展结果处理: 

允许定位在结果集的特定行。


从结果集的当前位置检索一行或多行。


支持对结果集中当前位置的行进行数据修改。


为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。


提供脚本、存储过程和触发器中使用的访问结果集中的数据的 Transact-SQL 语句。 
请求游标
Microsoft® SQL Server™ 2000 支持两种请求游标的方法: 

Transact-SQL 
对根据 SQL-92 游标语法制定的游标,Transact-SQL 语言支持使用它们的语法。

数据库应用程序编程接口(API)游标函数 
SQL Server 支持这些数据库 API 的游标功能:

ADO(Microsoft ActiveX® 数据对象)


OLE DB


ODBC(开放式数据库连接)


DB-Library 
应用程序不能混合使用这两种请求游标的方法。已经使用 API 指定游标行为的应用程序不能再执行 Transact-SQL DECLARE CURSOR 语句请求一个 Transact-SQL 游标。只有在将所有 API 游标特性均设回默认值后,应用程序才可以执行 DECLARE CURSOR。

如果 Transact-SQL 和 API 游标均未被请求,则默认情况下 SQL Server 将一个完整的结果集返回给应用程序,这个结果集称为默认结果集。

游标进程
Transact-SQL 游标和 API 游标有不同的语法,但下列一般进程可用于所有 SQL Server 游标: 

把游标与 Transact-SQL 语句的结果集相关联,并且定义游标的特征,如是否能够更新游标中的行。


执行 Transact-SQL 语句以填充游标。


检索想要查看的游标中的行。从游标中检索一行或多行的操作称为提取。执行一系列的提取操作以向前或向后检索行的操作称为滚动。


根据需要,对游标中当前位置的行执行修改操作(更新或删除)。


关闭游标。 

 

转发:游标很全的例子:(未看完)

http://www.android100.org/html/201405/02/7730.html

 

一、遇到的问题

存储过程中直接对select结果集进行加工 ,这个时候,我们需要一种能够让我们逐条处理每一行记录 的数据库对象。

  二、游标的概念

数据库对象。

  游标(Cursor) 可以看做一种数据类型,它可以用来遍历结果集,相当于指针,或者是数组中的下标。它处理结果集的方法有以下几种:

  定位到结果集的某一行

  从当前结果集的位置搜索一行或一部分行

  对结果集中的当前行进行数据修改

  三、游标的使用方法(创建、打开、读取、关闭、删除)

  【创建游标】

  和定义各种数据类型的方法有点像,但是注意,不要加“@”(实际上也有“游标类型的变量”,和“游标”的用法几乎完全相同,而且定义时使用@符 号)。下面是定义游标的语句:

  declare 游标名 cursor [local|global] [forward_only|scroll]

  for

  select查询语句

  游标分为局部游标和全局游标两种,local表示局部游标,global表示全局游标(默认值,可以省略)。当指定 forward_only(默认值,可以省略)时,游标是只进的,也就是说只能从头到尾地提取记录,如果需要在行之间来回跳跃,需要指定为scroll。

  【使用游标】

  只创建游标但是不使用它,就没有任何意义了。下面我们先举个最简单的例子来演示创建好游标之后的几步使用过程:

--【创建游标】
  declare C1 cursor for select xingming from yiren
  declare @xingming varchar(20)
  --【打开游标】
  open C1
  --【读取游标】
  fetch next from C1 into @xingming --while的特点就是要先写一次
  while(@@FETCH_STATUS=0)
  begin
  print '姓名:'+@xingming
  fetch next from C1 into @xingming
  end
  --【关闭游标】
  close C1
  --【删除游标】
  deallocate C1

  游标的使用方法是不是和Java中的 whle(rs.next()){}很像呢?实际上rs.next()执行时就直接在结果集中向后移动一条了,如果没有到达结果集的末端,仍然会执行循环 体。在这里使用游标也是一样,@@FETCH_STATUS的值为0时,游标尚未走到结尾。当它不为0了,游标就走到了结尾,将退出循环。

  fetch next from 游标名 into 变量名列表 是一种固定形式的读取游标内容的方法。当查询语句选择了多个字段的时候,读取时也需要借助这句话向多个变量赋值。于是写成变量名列表。

  【全局游标和scroll游标】

  前面提到全局游标和scroll游标,下面举个例子:

 

if(CURSOR_STATUS('global','CURSOR_2')!=-3) deallocate CURSOR_2
  declare CURSOR_2 cursor scroll --全局的scroll游标
  for select xingming,nicheng,xingbie from yiren
  --第一个T-SQL批开始
  open CURSOR_2
  declare @seq int,
  @xingming varchar(20),@nicheng varchar(50),@xingbie nchar
  set @seq=4
  fetch absolute @seq from CURSOR_2 into @xingming,@nicheng,@xingbie
  if(@@FETCH_STATUS=0)
  begin
  print '第'+cast(@seq as varchar)+'个艺人是:'+@xingming
  print case @xingbie when '男' then '他' when '女' then '她' end
  +'的昵称是:'+@nicheng
  end
  close CURSOR_2
  go
  --第二个T-SQL批开始
open CURSOR_2
  declare @seq int,
  @xingming varchar(20),@nicheng varchar(50),@xingbie nchar
  set @seq=5 --分成了两个批,需要再次定义@seq
from CURSOR_2 into @xingming,@nicheng,@xingbie
  if(@@FETCH_STATUS=0)
  begin
  print '第'+cast(@seq as varchar)+'个艺人是:'+@xingming
  print case @xingbie when '男' then '他' when '女' then '她' end
  +'的昵称是:'+@nicheng
  end
  close CURSOR_2
  go
  --在第三个批中删除游标
  deallocate CURSOR_2

  当开启了scroll选项后,fetch可以用于读next(后移)、prior(前移)、first(第一行)、last(最后一行)、 absolute(以数值定位到绝对行)、relative(以数值定位到相对行) 。

  全局游标一旦被定义就会一直存在,所以每个批处理都能看到它。直到使用deallocate来删除它,它才会消失。 CURSOR_STATUS('global','CURSOR_2')可以检查它的状态。

  【游标的嵌套】

  由于大大影响系统性能,简单了解一下即可。

if(CURSOR_STATUS('global','CURSOR_3')!=-3) deallocate CURSOR_3
  declare CURSOR_3 cursor for
  select yanchuid from yanchu
  open CURSOR_3
  declare @ycid int
  fetch next from CURSOR_3
  into @ycid
  while(@@FETCH_STATUS=0)
  begin
  print '参加第'+cast(@ycid as varchar)+'次演出的艺人是:'
  declare CURSOR_4 cursor for
  select xingming from yiren where yirenid in
  (select yirenid from yanchuyiren where yanchuid=@ycid)
游标
  declare @xingming varchar(50)
open CURSOR_4
from CURSOR_4 into @xingming
  while(@@FETCH_STATUS=0)
  begin
  print @xingming
  fetch next from CURSOR_4 into @xingming
  end
  close CURSOR_4
  deallocate CURSOR_4
  fetch next from CURSOR_3
  into @ycid
  print ''
  end
  close CURSOR_3
  deallocate CURSOR_3

  【游标变量】

游标变量是真正的把游标当做数据类型来使用的一种方法,游标变量和游标对象的区别就在于是否有@。创建游标变量的时候,首先declare @游标变量名 cursor,然后set @游标变量名=cursorfor select语句。

declare @c1 CURSOR
  set @c1=cursor for select xingming from yiren
open @c1
  declare @xingming varchar(50)
from @c1 into @xingming
  print @xingming
  close @c1
  deallocate @c1

  四、游标的注意事项

  【游标的缺点】

  使用游标会把结果集一条条取出来处理,增加了服务器的负担,再者使用游标的效率远远没有使用默认结果集的效率高。所以,能不用游标就尽量不要 用。

  【游标的补充说明】

  当我们刚刚打开一个游标的时候,它并不指向第一条记录,而是指向第一条记录的前边。我们可以拿书做比喻,游标不仅仅可以指向记录集中的记录(书 内容的每一页),也可以指向记录集外部没有记录的地方(书的封面和封底)。

  @@fetch_status有3种取值:0表示fetch 正常执行、-1表示fetch超出了结果集、-2表示fetch所指向的行已经不存在了。

存储过程,使用游标

  将第一个分支修改成如下代码:

if @currentpage >1
  begin
  if @currentpage>@totalpages
  begin
  set @currentpage = @totalpages
  end
  declare @start int,@count int
  set @count = 0
  set @start = @currentpage*@pagesize+1
  set @sql='declare cursor_1 cursor scroll for select * from '
  +@tablename+' order by '+@idname
  exec(@sql)
open cursor_1
  fetch relative @start,@pagesize from cursor_1
  while @@fetch_status=0
  begin
  set @count = @count+1
from cursor_1
  if @count=@pagesize-1
  break
  end
  close cursor_1
  deallocate cursor_1
  end
  并去掉原来go前面的
sql)

存储过程的最后额外再执行一次这句话,从而错误地再次生成@cursor_1游标