VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 数据库 > sql数据库 >
  • sql语句大全之游标

游标

迄今为止,我们已经讨论了如何处理数据集。这是背离过程化驱动语言处理事情的方法。实际上,当数据到达客户端的时候,大部分客户端总是不得不接受我们提供的数据集,然后逐行处理。它们要处理的是游标(Cursor)。

4.7.1  游标概述

游标是提取数据集的一种方法,而且可以与该集合中的单条记录交互。它不像人们想像的那样频繁出现,但实际有时通过修改或选择整个集合中的数据并不能得到所期望的结果。该集合是由一些具有共性的行产生(例如由SELECT语句定义),但随后基本上都需要逐行处理这些数据。
游标中的结果集与正常的SELECT语句之间有许多不同之处:
l   声明游标与实际执行游标是相互分开的。
l   游标和结果集在声明中命名,然后通过名字引用游标。
l   在游标中设置结果,一旦打开,就一直开放到关闭为止。
l   游标有一组用于操纵记录集的特殊命令。
虽然SQL Server具有处理游标的方法,但实际上SQL Server中也有一些对象库可以创建游标:
l   OLE DB (被ADO使用)
l   ODBC (被RDO、DAO使用,在某些情况下,也可以被OLE DB / ADO 使用)
l   DB-Lib (被VB-SQL使用)
客户端应用程序总是使用这些库访问单独记录。每一个库都提供操纵结果集和管理游标的语法。所以一旦学会了游标的一个对象模型,就学会了操纵所有游标的大部分方法

4.7.2  使用游标

使用游标有四种基本步骤:声明游标、打开游标、提取数据、关闭游标。
1.声明游标
声明游标的语法结构如下所示:
DECLARE cursor_name [INSENSITIVE][SCROLL] CURSOR
FOR query_expression
[FOR{READ ONLY | UPDATE [OF column_name[,…n]]}]
该语句中各参数的含义如下所示:
l   Cursor_name 指定游标的名称
l   INSENSITIVE 定义一个游标,以创建将由该游标使用的数据的临时复本。
l   SCROLL 指定滚动式游标,即所有的提取选项(FIRST , LAST , PRIOR , NEXT , RELATIVE , ABSOLUTE,ABSOLUTE)均可用。
l   Query_expression 查询表达式,一般为SELECT语句。
l   READ ONLY 禁止通过该游标进行更新。
l   UPDATE [OF column_name[,...n]] 定义游标中可更新的列。
例如,声明一个游标,用来指向【读者信息(Reader)】和【借阅信息(BorrowORreturn)】表中的每一行数据。声明语句如下:
USE BookDateBase
DECLARE Reader_cur SCROLL CURSOR
FOR
SELECT * FROM Reader  R , BorrowORreturn  B
WHERE  B.Rcert =’10010’  and  B.Rcert = R.Rcert
该语句中,声明了一个名为Reader_cur的滚动式游标并定义了一个SELECT语句。这个SELECT语句返回读者信息表和借阅信息表中卡号是10010的所有信息。
2.打开游标
声明了游标这后在作其它操作之前,发布打开他。打开游标的语句的语法结构如下所示:
OPNE Cursor_name
由于打开游标是对数据库进行一些SQL SELECT的操作,它将耗费一段时间,主要取决于您使用的系统性能和这条语句的复杂程序。如果执行的时间较长,可以考虑将屏幕上显示的鼠标改为hourglass。
3.提取数据
当用OPEN语句打开了游标并在数据库中执行了查询后,你不能立即利用在查询结果集中的数据。你必须用FETCH语句来取得数据。一条FETCH语句一次可以将一条记录放入程序员指定的变量中。FETCH其语法结构如下所示:
FETCH [[fetch_orientation] from]
Cursor_name [into host_variables]
其中,fetch_orientation表示游标的取数方向。host_variables表示允许将提取操作的列数据放到局部变量中。当游标为滚动式游标时,游标的取数方向有如下6种可以使用:
l   NEXT 返回紧跟当前行之后的结果行。
l   PRIOR 返回当前行的前一结果行。
l   FIRST 返回游标中的第一行并将其作为当前行。
l   LAST 返回游标中的最后一行并将其作为当前行。
l   ABSOLUTE n 检索n值指定的行。如果N为正数,则返回从游标开始的第n行,并将返回行变成新的当前行。如果N为负数,则返回从游标末尾开始的第n行,并将返回行变成新的当前行。如果n为0,则不返回行。n必须是整数常量。
l   RELATIVE n  检索相对于当前游标位置的行。如果n为正数,则返回从当前行开始第n行,并将返回行变成新的当前行。如果n为负数则返回当前行之前的第n行,并将返回行变成新的当前行。
例1,对表【读者信息(Reader)】和【借阅信息(BorrowORreturn)】中列【读者级别(rleve)】进行修改。
FETCH  Reader_cur
UPDATE Reader , BorrowORreturn
SET rleve='高级'
WHERE CURRENT OF Reader_cur
上述语句中,首先使用FETCH语句提取数据行,然后使用UPDATE语句进行更新操作。首次执行操作语句,将更新结果集中的第一行,再次执行该语句,则FETCH语句会自动提取下一行数据,并进行更新。
例2,对游标“Reader_cur”返回结果集中的数据行进行删除,语句如下所示:
FETCH  Reader_cur
DELETE Reader , BorrowORreturn
WHERE CURRENT OF Reader_cur
首先运行该语句,将删除游标“Reader_cur”返回结果集中的第一行数据,如果再次运行该语句,将删除下一行数据。
3.关闭游标
在游标使用完成后,为了节省系统资源,必须将游标关闭。关闭游标语句的语法结构如下所示:
CLOSE cursor_name
例如:关闭游标“Reader_cur”的语句如上所示:
CLOSE Reader_cur

4.8  扩展练习

扩展练习4-1:声明用于插入操作的事务
事务是对数据库操作的集合,使用事务可以保持数据库的完整性,在本实验指导中将声明一个用于插入的事务。这里向数据库BookDateBase的表Reader中插入一条记录。
(1)启动Microsoft SQL Server Management Studio后,新建查询窗口。
(2)指定要使用的BookDateBase数据库,再声明事务。语句如下:
USE BookDateBase
BEGIN TRANSACTION
(3)向Reader表中插入一条记录,语句如下:
INSERT INTO [BookDateBase].[dbo].[Reader]
           ([Rcert],[Rpwd],[Rname],[Rsex],[Rphone],[rleve])
     VALUES ('10018','shihoho','会牛牛','男','15236985412','高级')
GO
(4)提交事务,将插入操作应用到数据库。
COMMIT TRANSACTION
(5)执行上述操作如图4-18所示。

图4-18  执行事务
扩展练习4-2:声明并使用可更新游标
可更新游标可以指定要更新的列,并对其进行修改操作。在BookDateBase数据库中创建一个名为“Reader_cur“的可更新游标,并更新其密码列数据。
(1)启动Microsoft SQL Server Management Studio后,新建查询窗口。
(2)声明“Reader_cur”的游标,并指定SELECT语句的结果集。
use BookDateBase
declare Reader_cur SCROLL CURSOR
FOR
SELECT * FROM Reader
For update of Rpwd
(3)找开游标。
OPEN Reader_cur
(4)检索数据,并使用定位UPDATE语句更新数据列密码。
FETCH Reader_cur
UPDATE Reader
set Rpwd='123'
WHERE CURRENT OF Reader_cur

相关教程