前言
本章内容将从六个方面介绍关于游标的知识,分别是其定义、声明、打开、使用、关闭、删除,另外还会介绍静态游标和动态游标。
一、游标的定义
当对由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求商品信息表第一行的商品信息。
> 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
例2、根据信息,在数据库Sales中,定义一个游标CURSOR_3求销售员信息表员工的工号、姓名、性别、住址、电话信息。
这里使用了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
七、静态游标和动态游标
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求商品信息表最后一行的商品信息。
这里因为求得最后一行信息即要使用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
例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
结语
以上就是本次数据库原理与应用的全部内容,篇幅较长,感谢您的阅读和支持,若有表述或代码中有不当之处,望指出!您的指出和建议能给作者带来很大的动力!!!