bitsCN.com

在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句。但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢?游标为我们提供了一种极为优秀的解决方案。

1.1 游标和游标的优点

在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条T_SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。

我们知道关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中。因此我们必须借助于游标来进行嫦虻ヌ跫锹嫉氖?荽?怼?BR> 由此可见,游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。

1.2 游标种类

MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API 服务器游标和客户游标。

(1) Transact_SQL 游标

Transact_SQL 游标是由DECLARE CURSOR 语法定义、主要用在Transact_SQL 脚本、存储过程和触发器中。Transact_SQL 游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL 语句或是批处理、存储过程、触发器中的Transact_SQL 进行管理。 Transact_SQL 游标不支持提取数据块或多行数据。

(2) API 游标

API 游标支持在OLE DB, ODBC 以及DB_library 中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API 游标函数,MS SQL SEVER 的OLE DB 提供者、ODBC驱动器或DB_library 的动态链接库(DLL)都会将这些客户请求传送给服务器以对API游标进行处理。

(3) 客户游标

客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于服务器游标并不支持所有的Transact-SQL 语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。因为在一般情况下,服务器游标能支持绝大多数的游标操作。

由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。在本章中我们主要讲述服务器(后台)游标。

select count(id) from info

select * from info

--清除所有记录

truncate table info

declare @i int

set @i=1

while @i<1000000

begin

insert into info values('Justin'+str(@i),'深圳'+str(@i))

set @i=@i+1

end

1.3 游标操作

使用游标有四种基本的步骤:声明游标、打开游标、提取数据、关闭游标。

声明游标

象使用其它类型的变量一样,使用一个游标之前,首先应当声明它。游标的声明包括两个部分:游标的名称;这个游标所用到的SQL语句。如要声明一个叫作Cus-tomerCursor的游标用以查询地址在北京的客户的姓名、帐号及其余额,您可以编写如下代码:

DECLARE CustomerCursor CURSOR FOR

SELECT acct_no,name,balance

FROM customer

WHERE province="北京";

在游标的声明中有一点值得注意的是,如同其它变量的声明一样,声明游标的这一段代码行是不执行的,您不能将debug时的断点设在这一代码行上,也不能用IF...END IF语句来声明两个同名的游标,如下列的代码就是错误的。

IF Is_prov="北京"THEN

DECLARE CustomerCursor CURSOR FOR

SELECT acct_no,name,balance

FROM customer

WHERE province="北京";

ELSE

DECLARE CustomerCursor CURSOR FOR

SELECT acct_no,name,balance

FROM customer

WHERE province〈〉"北京";

END IF

打开游标

声明了游标后在作其它操作之前,必须打开它。打开游标是执行与其相关的一段SQL语句,例如打开上例声明的一个游标,我们只需键入:

OPEN CustomerCursor;

由于打开游标是对数据库进行一些SQL SELECT的操作,它将耗费一段时间,主要取决于您使用的系统性能和这条语句的复杂程度。如果执行的时间较长,可以考虑将屏幕上显示的鼠标改为hourglass。

提取数据

当用OPEN语句打开了游标并在数据库中执行了查询后,您不能立即利用在查询结果集中的数据。您必须用FETCH语句来取得数据。一条FETCH语句一次可以将一条记录放入程序员指定的变量中。事实上,FETCH语句是游标使用的核心。在DataWindow和DataStore中,执行了Retrieve ()函数以后,查询的所有结果全部可以得到;而使用游标,我们只能逐条记录地得到查询结果。

已经声明并打开一个游标后,我们就可以将数据放入任意的变量中。在FETCH语句中您可以指定游标的名称和目标变量的名称。如下例:

FETCH CustmerCur-sor

INTO:ls_acct_no,

:ls_name,

:ll_balance;

从语法上讲,上面所述的就是一条合法的取数据的语句,但是一般我们使用游标却还应当包括其它的部分。正如我们前面所谈到的,游标只能一次从后台数据库中取一条记录,而在多数情况下,我们所想要作的是在数据库中从第一条记录开始提取,一直到结束。所以我们一般要将游标提取数据的语句放在一个循环体内,直至将结果集中的全部数据提取后,跳出循环圈。通过检测SQLCA.SQL-CODE的值,可以得知最后一条FETCH语句是否成功。一般,当SQLCODE值为 0时表明一切正常,100表示已经取到了结果集的末尾,而其它值均表明操作出了问题,这样我们可以编写以下的代码:

bitsCN.com

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

mysql 游标原理_SQL 游标原理和使用方法_MySQL相关推荐

  1. mysql数据库sql注入原理_sql注入原理详解(一)

    防止SQL注入: 1.开启配置文件中的magic_quotes_gpc和magic_quotes_runtime设置 2.执行sql语句时使用addslashes进行sql语句转换 3.Sql语句书写 ...

  2. mysql的游标写法_SQL 游标的写法

    DECLARE @Y1002 varchar(200),@A0100 varchar(200),@C0103 datetime ----定义变量 DECLARE Police_Department C ...

  3. mysql数据库sql注入原理_SQL注入原理解析以及举例1

    sql注入是指web应用程序对用户输入数据的合法性没有判断,导致攻击者可以构造不同的sql语句来实现对数据库的操作. sql注入漏洞产生满足条件: 1:用户能够控制数据的输入. 2:原本需要执行的代码 ...

  4. mysql去重的最方便的两种方法_mysql去重的最方便的两种方法

    参考资料:http://blog.csdn.net/guocuifang655/article/details/3993612 方法一: 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然m ...

  5. mysql导出trigger_用mysqldump导出Trigger问题解决方法_MySQL

    mysqldump 描述如下: 用mysqldump 导出 Trigger 的时候遇到一个问题,贴出来,以免大家犯错. 在执行下面的操作时: [root@ytt ~]# /usr/local/mysq ...

  6. mysql游标 原理解说_mysql存储过程之游标(DECLARE)原理与用法详解

    本文实例讲述了mysql存储过程之游标(DECLARE)原理与用法.分享给大家供大家参考,具体如下: 我们在处理存储过程中的结果集时,可以使用游标,因为游标允许我们迭代查询返回的一组行,并相应地处理每 ...

  7. 简述游标原理 mysql_mysql游标的原理与用法实例分析

    本文实例讲述了mysql游标的原理与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是游标 创建游标 使用游标 首发日期:2018-04-18 什么是游标: 如果你前面看过mysql函数,会发 ...

  8. Oracle 原理:游标,显示游标、隐式游标、参照游标

    Oracle 游标有三种:显示游标.隐式游标.参照游标. fetch...bulk collect into select 语句会把结果集全部返回给用户,而无法对结果集中的每行数据进行单独的操作.因此 ...

  9. 简述游标原理 mysql_SQL游标原理和使用方法_MySQL

    bitsCN.com 在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句.但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录. ...

最新文章

  1. makefile ifneq多个判断条件_一文入门Makefile
  2. WebService在开发中的实际问题
  3. mysql列目录_mysql列直接存储图片路径
  4. thinkphp5项目--个人博客(六)
  5. java(IO)读写文件乱码转换UTF-8问题
  6. python如何打印字符串_如何在Python中打印“漂亮”字符串输出
  7. centos安装Python2.7
  8. qemu搭建arm运行linux内核,centos使用qemu搭建ARM64运行环境
  9. vscode无法识别constexpr
  10. C++—— cin输入流详解
  11. UIButton的创建与释放问题
  12. python函数的目的与意义_Python函数__new__及__init__作用及区别解析
  13. sublime3快捷键
  14. RabbitMQ学习笔记:安装环境
  15. jQuery操作Form表单元素
  16. python server酱_教你如何使用Python向手机发送通知(IFTTT)
  17. OpenCV自带的CamShift算法解读
  18. ToLua(LuaFramework) -ToLua框架使用指南
  19. Guge搜索引擎汇总
  20. 十年之后再看,腾讯位置服务的发展与腾讯地图的融合

热门文章

  1. 关于微信公众号配置URL时token验证失败
  2. Python实现图片转化为字符图(附完整代码)
  3. 中国的外企之一瞥--与上海10万年薪外企职员谈
  4. 关于org.apache.jasper.JasperException: 无法为JSP编译类:
  5. 世界随机迷宫:客户端需求整理
  6. 金融行业走向认知分几步 ?
  7. 运算放大器初探-运算放大器的选型
  8. 剑指Offer—位运算
  9. Acwing 1077. 皇宫看守
  10. 大数据平台的分类与选型指南