数据库原理与应用(SQL Server)笔记 第十一章 游标

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 数据库原理与应用(SQL Server)笔记 第十一章 游标

前言


本章内容将从六个方面介绍关于游标的知识,分别是其定义、声明、打开、使用、关闭、删除,另外还会介绍静态游标和动态游标。


一、游标的定义


当对由SELECT语句返回的结果集中的某一行或部分行进行单独处理时,就要用到一种扩展,也就是游标,游标提供了对一个结果集进行逐行处理的能力。

游标可以保存查询结果,方便下文调用,因为使用游标会保存数据行的副本,在创建游标后,下文查询即可从副本中查询,比直接查数据库快很多。


二、游标的声明


游标包括两部分,一是游标结果集,即是由SELECT语句返回的结果集的集合,二是游标当前行指针,即指向该结果集中某一行的指针。

声明游标使用DECLARE CURSOR语句,格式如下:

DECLARE <游标的名称>(INSENSITIVE)(SCROLL)CURSOR
/*INSENSITIVE表示对基表的任何改动都不会影响到游标数据中,且表示游标是只读的,不允许修改,也不能通过它修改基表的数据。*/
/*SCROLL表示使用所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE),若不指定只能使用NEXT提取选项。*/
FOR 
<SELECT 语句>


三、游标的打开


当游标被打开时,其游标位置位于第一行。

打开游标使用OPEN语句,格式如下:

OPEN (GLOBAL)<游标的名称>
/*GLOBAL表示打开的是全局游标,否则打开的是局部游标*/


四、游标的使用


使用FETCH语句使游标来提取数据,格式如下:

FETCH NEXT/PRIOR/FIRST/LAST/RELATIVE n/ABSOLUTE n FROM (GLOBAL)<游标的名称>
(INTO <变量的名称>)
/*INTO表示将读取的游标数据存放到指定的变量中,后跟变量的名称*/


这里的NEXT/PRIOR/FIRST/LAST/RELATIVE n/ABSOLUTE n用于表示游标读取数据的位置。

(1)NEXT表示读取游标中当前行的下一行,且将其作为当前行;

(2)PRIOR表示读取游标中当前行的前一行,且将其作为当前行;

(3)FIRST表示读取游标中的第一行,且将其作为当前行;

(4)LAST表示读取游标中的最后一行,且将其作为当前行;

(5)RELATIVE n表示读取游标的当前行的前或后n行,若n>0,则读取游标当前行起向后的第n行数据,若n<0,则读取游标当前行起向前的第n行数据,且将其作为当前行;

(6)ABSOLUTE n表示读取游标从第一行或最后一行开始的第n行,若n>0,则读取从结果集的第一行(包括第一行)起向后的第n行,若n<0,则读取从结果集的最后一行起向前的第n行,且将其作为当前行。


五、游标的关闭


关闭游标使用CLOSE语句,格式如下:

CLOSE <游标的名称>


六、游标的删除


在关闭游标后,要释放其占用的系统空间,删除游标使用DEALLOCATE语句,格式如下:

DEALLOCATE <游标的名称>


例1、根据下表信息,在数据库Sales中,定义一个游标CURSOR_0求商品信息表第一行的商品信息。

1667042047992.jpg

> sql语句:

USE Sales DECLARE CURSOR_0 CURSOR FOR SELECT* FROM Product OPEN CURSOR_0 FETCH NEXT FROM CURSOR_0 CLOSE CURSOR_0 DEALLOCATE CURSOR_0

1667042059357.jpg

例2、根据信息,在数据库Sales中,定义一个游标CURSOR_3求销售员信息表员工的工号、姓名、性别、住址、电话信息。

1667042071056.jpg

这里使用了WHILE语句,其条件表达式中采用的@@FETCH_STATUS函数返回上一条游标FETCH语句的状态,当返回值为0,循环继续进行,否则退出循环,从而达到求销售员信息表的员工信息。

sql语句:

USE Sales DECLARE @SaleID char(3),@Salename varchar(20),@Sex char(2), @Address varchar(60),@Telephone varchar(20) DECLARE CURSOR_3 CURSOR FOR SELECT SaleID,Salename,Sex,Address,Telephone FROM Seller OPEN CURSOR_3 FETCH NEXT FROM CURSOR_3 INTO @SaleID,@Salename,@Sex,@Address,@Telephone PRINT '工号 姓名 性别 住址 电话' PRINT '-------------------------------------------' WHILE @@FETCH_STATUS=0 BEGIN PRINT @SaleID+' '+@Salename+' '+@Sex+' '+@Address+' '+@Telephone FETCH NEXT FROM CURSOR_3 INTO @SaleID,@Salename,@Sex,@Address,@Telephone END CLOSE CURSOR_3 DEALLOCATE CURSOR_3

1667042101627.jpg


七、静态游标和动态游标


SQL Server支持的API服务器游标分为一下4种,分别是静态游标、动态游标、只进游标和键集驱动游标,这里只介绍前两种游标。

1、静态游标,即只有NEXT操作。


/SCROLL表示使用所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE),若不指定只能使用NEXT提取选项。/


上面例1、2定义的即是静态游标。

2、动态游标,有多种操作(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)。


例3、根据下表信息,在数据库Sales中,定义一个游标CURSOR_1求商品信息表最后一行的商品信息。

1667042120379.jpg

这里因为求得最后一行信息即要使用LAST,所以要在CURSOR前面加SCROLL,使其变为动态游标。

sql语句:

USE Sales DECLARE CURSOR_1 SCROLL CURSOR FOR SELECT * FROM Product OPEN CURSOR_1 FETCH LAST FROM CURSOR_1 CLOSE CURSOR_1 DEALLOCATE CURSOR_1

1667042147865.jpg


例4、根据例3信息,在数据库Sales中,定义一个游标CURSOR_2分别求商品信息表中最后一行、游标当前行起前的第3行数据、游标当前行的前一行、表中第一行起向后的第2行、表中的第一行的数据。

sql语句:

USE Sales DECLARE CURSOR_2 SCROLL CURSOR FOR SELECT * FROM Product OPEN CURSOR_2 FETCH LAST FROM CURSOR_2 --读取表中最后一行,且将其作为当前行 FETCH RELATIVE -3 FROM CURSOR_2 --读取游标当前行起前的第3行数据,且将其作为当前行 FETCH PRIOR FROM CURSOR_2 --读取游标当前行的前一行,且将其作为当前行 FETCH ABSOLUTE 2 FROM CURSOR_2 --读取表中第一行起向后的第2行,且将其作为当前行 FETCH FIRST FROM CURSOR_2 --读取表中的第一行,且将其作为当前行 CLOSE CURSOR_2 DEALLOCATE CURSOR_2

1667042164552.jpg


结语


以上就是本次数据库原理与应用的全部内容,篇幅较长,感谢您的阅读和支持,若有表述或代码中有不当之处,望指出!您的指出和建议能给作者带来很大的动力!!!


相关文章
|
2月前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
300 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
1月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
147 6
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
2月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
7月前
|
SQL 数据库 数据安全/隐私保护
数据库数据恢复——sql server数据库被加密的数据恢复案例
SQL server数据库数据故障: SQL server数据库被加密,无法使用。 数据库MDF、LDF、log日志文件名字被篡改。 数据库备份被加密,文件名字被篡改。
|
3月前
|
SQL 人工智能 Linux
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC0 发布 - 从本地到云端的 AI 就绪企业数据库
235 5
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
4月前
|
SQL 存储 数据库
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
859 0
|
4月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
400 0
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
280 13
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例