让数据库游标变得简单

标签: 数据库 游标 | 发表时间:2012-08-01 22:13 | 作者:手心上的冰山
出处:http://www.blogjava.net/

(一)浅谈游标

      (1)游标的概念

      游标是指向查询结果集的一个指针,它是一个通过定义语句与一条Select语句相关联的一组SQL语句,即从结果集中逐一的读取一条记录。游标包含两方面的内容:

       ●游标结果集:执行其中的Select语句所得到的结果集;

       ●游标位置:一个指向游标结果集内的某一条记录的指针

       利用游标可以单独操纵结果集中的每一行。游标在定义以后存在两种状态:关闭和打开。当游标关闭时,其查询结果集不存在;只有当游标打开时,才能按行读取或修改结果集中的数据。

    (2)浅谈游标

         游标我们可以通俗的解释为变动的标示。正如它的解释一样,数据库中的游标其实也是一种读取数据的方式。举个简单的例子来说:我有一个电话本,电话本上的号码首先是按地域划分的,现在我想找个家住廊坊的李四。首先我们要做的是先找到廊坊地区的电话表,找到后的表也即是我们上面所说的游标结果集;而为了找到李四我们可能会用手一条一条逐行的扫过,以帮助我们找到所需的那条记录。对应于数据库来说,这就是游标的模型。所以,你可以这样想象:表格是数据库中的表,而我们的手好比是游标。

       总结来说游标就好比是在电话本上逐一扫描号码的手指。

(二)使用游标

       一个应用程序中可以使用两种类型的游标:前端(客户)游标和后端(服务器)游标,它们是两个不同的概念。

       但无论使用哪种游标,都必须经过如下的步骤:

       ●声明游标

       ●打开游标

       ●从游标中操作数据

       ●关闭游标

      下面我们主要讲述下服务器游标:

      (1)定义游标

         使用游标之前必须先声明它。声明指定定义游标结果集的查询。通过使用for update或for read only关键词将游标显式定义成可更新的或只读的。

      Declare cursor_name  cursor

     For select_statement

     [for{read only|update[of colum_name_list]}]

      举例:

      Declare  company_crsr cursor

      For select name,salary from company where salary>2000

      For update of name,salary

      上面我们声明了一个名为company_crsr的游标。

      (2)打开游标

         open的语法为:

                         open 游标名

        在声明游标后,必须打开它以便用fetch,update,delete读取、修改、删除行。在打开一个游标后,它将被放在游标结果集的首行前,必须用fetch语句访问该首行。

      (3)读取游标数据

      在声明并打开一个游标后,可用fetch命令从游标结果集中获取数据行。

      Fetch的语法为:

           Fetch [[Next | Prior | First | Last | Absolute{n|@nvar} |Relative {n|@nvar}]

         From]  游标名 [into 变量列表]

      参数说明:

      Next:返回结果集中当前行的下一行,如果该语句是第一次读取结果集中数据则返回的是第一行

      Prior:返回结果集中当前行的上一行,如果该语句是第一次读取结果集中的数据则无记录结果返回并把游标位置设置为第一行。

      First:返回游标第一行;Last:返回游标中的最后一行;

      Absolute{n|@nvar}:如果 n 或 @nvar 为正数,返回从游标头开始的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为负数,返回游标尾之前的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为 0,则没有行返回。n 必须为整型常量且 @nvar 必须为smallint、tinyint 或 int。

      RELATIVE {n | @nvar}:如果 n 或 @nvar 为正数,返回当前行之后的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为负数,返回当前行之前的第 n 行并将返回的行变成新的当前行。如果 n 或 @nvar 为 0,返回当前行。如果对游标的第一次提取操作时将FETCH RELATIVE 的 n 或 @nvar 指定为负数或 0,则没有行返回。n 必须为整型常量且@nvar 必须为 smallint、tinyint 或 int。

      举例:

       Fetch  next

       company_crsr into @name,@salary

      SQL Server在每次读取后返回一个状态值。可用@@sql_status访问该值,下表给出了可能的@@sql_status值及其意义。

    值意义:

             0——Fetch语句成功

             1——Fetch语句导致一错误

             2——结果集没有更多的数据,当前位置位于结果集最后一行,而客户对该游标仍发出Fetch语句时。

     若游标是可更新的,可用update和delete语句来更新和删除行。

     删除游标当前行的语法为:

                      Delete [from] 表名

                      where current of 游标名

     举例:delete from authors where current of authors_crsr

     当游标删除一行后,SQL Server将游标置于被删除行的前一行上。

     更新游标当前行的语法为:

       update 表名

       set column_name1={expression1|NULL|(select_statement)}

              [,column_name2={expression2|NULL|(select_statement)}

              [……]

       where current of 游标名

      举例:

        update company

        set name=”张三”,salary=”5000”

        where current of company_crsr

    (4)关闭游标

       当结束一个游标结果集时,可用close关闭。该语法为:

           close 游标名

       关闭游标并不改变其定义,可用open再次打开。若想放弃游标,必须使用deallocate释放它,deallocater的语法为:

        deallocater cursor 游标名

        deallocater语句通知SQL Server释放Declare语句使用的共享内存,不再允许另一进程在其上执行Open操作。



相关 [数据库 游标] 推荐:

让数据库游标变得简单

- - BlogJava-首页技术区
      (1)游标的概念.       游标是指向查询结果集的一个指针,它是一个通过定义语句与一条Select语句相关联的一组SQL语句,即从结果集中逐一的读取一条记录.        ●游标结果集:执行其中的Select语句所得到的结果集;.        ●游标位置:一个指向游标结果集内的某一条记录的指针.

数据库sharding

- - 数据库 - ITeye博客
当团队决定自行实现sharding的时候,DAO层可能是嵌入sharding逻辑的首选位置,因为在这个层面上,每一个DAO的方法都明确地知道需要访问的数据表以及查询参数,借助这些信息可以直接定位到目标shard上,而不必像框架那样需要对SQL进行解析然后再依据配置的规则进行路由. 另一个优势是不会受ORM框架的制约.

数据库索引

- - CSDN博客推荐文章
索引是由用户创建的、能够被修改和删除的、实际存储于数据库中的物理存在;创建索引的目的是使用户能够从整体内容直接查找到某个特定部分的内容. 一般来说,索引能够提高查询,但是会增加额外的空间消耗,并且降低删除、插入和修改速度. 1.聚集索引:表数据按照索引的顺序来存储的. 2.非聚集索引:表数据存储顺序与索引顺序无关.

数据库事务

- - 数据库 - ITeye博客
事务传播发生在类似以下情形:. 假设methodB的配置是:. 如果methodA在事务里,那么methodB也在这个事务中运行. 如果methodA不在事务里,那么methodB重新建立一个事务运行. 如果methodA在事务里,那么methodB也在这个事务中运行. 如果methodA不在是事务里,那么methodB在非事务中运行.

数据库优化

- - 数据库 - ITeye博客
程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点: . a) SQL的使用规范: .   i.尽量避免大事务操作,慎用holdlock子句,提高系统并发能力.   ii.尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接.   iii.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作.

数据库调优

- - 数据库 - ITeye博客
1、1、调整数据结构的设计. 这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等. 这一部分也是在开发信息系统之前完成,程序员在这一步需要考虑应用程序使用什么样的体系结构,是使用传统的Client/Server两层体系结构,还是使用Browser/Web/Database的三层体系结构.

MySQL数据库的修复

- Xin - 博客园-首页原创精华区
找到mysql的安装目录的bin/myisamchk工具,在命令行中输入:. 然后myisamchk 工具会帮助你恢复数据表的索引. 好象也不用重新启动mysql,问题就解决了. 当你试图修复一个被破坏的表的问题时,有三种修复类型. 如果你得到一个错误信息指出一个临时文件不能建立,删除信息所指出的文件并再试一次--这通常是上一次修复操作遗留下来的.

Oracle 发布 NoSQL 数据库

- 冷月 - 博客园新闻频道
  Oracle 作为全球最大的关系型数据库提供商,在其产品链条中,也加入了 NoSQL 数据库这一环,而且这个新的数据库名字很霸气,就叫 NoSQL Database,想起了当年新浪微博更换 weibo.com 域名之时的一个笑话:. 原来有三家人做面包,张三家的面包叫三张牌面包,李四家的牌子叫李四牌面包,王五家出品的是王五牌面包,而突然有一天,张三家的面包改名了,叫面包牌面包.

WineHQ 数据库泄漏

- gnawux - LinuxTOY
运行于 *Nix 之上的开源跨平台 Win32 API 兼容层 WineHQ 的 AppDB 和 Bugzilla 数据库被黑客攻击. CodeWeavers CEO Jeremy 在信中提到黑客利用某种方式获取了 WineHQ 的 AppDB 和 Bugzilla 的访问,并且下载了完整数据库文件.