-
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]]}]
该语句中各参数的含义如下所示: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的所有信息。DECLARE Reader_cur SCROLL CURSOR
FOR
SELECT * FROM Reader R , BorrowORreturn B
WHERE B.Rcert =’10010’ and B.Rcert = R.Rcert
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种可以使用:Cursor_name [into host_variables]
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语句会自动提取下一行数据,并进行更新。UPDATE Reader , BorrowORreturn
SET rleve='高级'
WHERE CURRENT OF Reader_cur
例2,对游标“Reader_cur”返回结果集中的数据行进行删除,语句如下所示:
FETCH Reader_cur
DELETE Reader , BorrowORreturn
WHERE CURRENT OF Reader_cur
首先运行该语句,将删除游标“Reader_cur”返回结果集中的第一行数据,如果再次运行该语句,将删除下一行数据。DELETE Reader , BorrowORreturn
WHERE CURRENT OF 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表中插入一条记录,语句如下:BEGIN TRANSACTION
INSERT INTO [BookDateBase].[dbo].[Reader]
([Rcert],[Rpwd],[Rname],[Rsex],[Rphone],[rleve])
VALUES ('10018','shihoho','会牛牛','男','15236985412','高级')
GO
(4)提交事务,将插入操作应用到数据库。([Rcert],[Rpwd],[Rname],[Rsex],[Rphone],[rleve])
VALUES ('10018','shihoho','会牛牛','男','15236985412','高级')
GO
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)找开游标。declare Reader_cur SCROLL CURSOR
FOR
SELECT * FROM Reader
For update of Rpwd
OPEN Reader_cur
(4)检索数据,并使用定位UPDATE语句更新数据列密码。
FETCH Reader_cur
UPDATE Reader
set Rpwd='123'
WHERE CURRENT OF Reader_cur
UPDATE Reader
set Rpwd='123'
WHERE CURRENT OF Reader_cur
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式