数据库之T_SQL 游标

何谓游标

游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标可以被看作是一个查询结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成的一个临时文件,提供了在查询结果集中向前或向后浏览数据、处理结果集中数据的能力。**有了游标,用户就可以访问结果集中任意一行数据,在将游标放置到某行之后,可以在该行或从该位置的行块上执行操作。
游标主要包括以下两部分:
(1)游标结果集:由定义游标的SELECT语句返回的行的集合
(2)游标位置 :指向这个结果集中的某一行的指针
游标的特点:

  • 游标返回一个完整的结果集,但允许程序设计语言只调用集合中的一行
  • 允许定位在结果集的特定行
  • 从结果集的当前位置检索一行或多行
  • 支持对结果集中当前位置的行进行数据修改
  • 可以为其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持。
  • 提供脚本、存储过程和触发过程中使用的访问结果集中数据的T_SQL语句。

分类

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 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。

如何使用游标

①声明游标
游标在使用之前必须先声明,可用DECLARE CURSOR语句声明游标,其一般格式为:
DECLAR<游标名>[INSENSITIVE][SCROLL]CURSOR
FOR select_statement
[FOR{READ ONLY|UPDATE[OF<列名>[,<列名>…]]}]
说明:
INSENSITIVE——使用数据的临时复制来定义游标,这时的游标实际上是不允许修改的。
SCROLL——可以使用任何方法来存取数据,允许更新和删除。
FOR select_statement——使用SELECT查询块来定义一个游标。
FOR READ ONLY或FOR UPDATE——说明是只读的游标还是可修改的游标。
②打开游标
使用OPEN语句的功能打开游标,实际上就是执行相应的SELECT查询语句,将查询结果放到缓冲区。这时游标处于活动状态,游标指针指向第一条记录。其一般格式为:
OPEN<游标名>
③提取(检索)游标
FETCH语句是从游标中提取特定的一行。其一般格式为:
FETCH
[[NEXT|PRIOR|FIRST|LAST|ABSOLUTE n|RELATIVE n]FROM]
<游标名>
[INTO:<主变量1>,<主变量2>…]
说明:
NEXT——如果是在OPEN后第一次执行FETCH命令,则返回结果集的第一行,否则使游标的指针指向结果集的下一行,NEXT是默认的选项。
PRIOR——返回结果集当前行的前一行。
FIRST——返回结果集的第一行。
LAST——返回结果集的最后一行。
ABSOLUTE n——如果n是正数,返回结果集的第n行,如果n是负数,则返回结果集的倒数第n行。
RELATIVE n——如果n是正数,返回当前行后的第n行,如果n是负数,则返回当前行开始倒数的第n行。
INTO——该语句的功能是把游标取出的当前记录送入到主变量,INTO后的主变量要与在DECLARE CURSOR中SELECT的字段相对应。
④关闭游标
使用CLOSE 语句关闭游标,其一般格式为:
CLOSE<游标名>
⑤释放游标
使用DEALLOCATE语句释放游标,其一般格式为:
DEALLOCATE<游标名>

案例分析

1.游标的声明
例子:

DECLARE STUDENT_CURSOR SCROLL CURSOR
'定义student_cursor这个游标变量,scroll cursor意味着可以指定cursor这个关键字,可以随机指定游标的具体位置,任意从结果集中提取数据
FOR  SELECT * FROM 学生信息
for read only/update
DEALLOCATE STUDENT_CURSOR'释放游标后才可以进行修改

2.游标的操作

declare stu_sursor scroll cursor
for select 姓名 FROM 学生信息

OPEN stu_cursor'打开游标

DECLARE @NAME VARCHAR(20)
FETCH NEXT/FIRST/LAST/PRIOR/ABSOLUTE  FROM stu_cursor 
INTO @NAME
PRINT @NAME
CLOSE stu_cursor

DEALLOCATE stu_cursor

3.完整示例

declare stu_cursor scroll cursor for
select 学号 FROM 学生信息
create table #t(name nvarchar(20),sorce int)'创建临时表#t用于保存查询的信息
OPEN stu_cursor

DECLARE @NAME VARCHAR(20)
FETCH next FROM stu_cursor'检索下一行'
INTO @NAME
while @@FETCH_STATUS=0'判断游标提取状态,若值为0,则FETCH语句成功,此时执行begin语句
begin
insert into #t
SELECT B.姓名,AVG(分数) AS 分数
FROM 成绩信息 A JOIN 学生信息 B
ON A.学生编号=B.学号
where A.考试编号='0801' AND B.学号=@NAME
group by B.姓名 '根据B表中的姓名分组'
/*
.
.
.
*/
'使用连续符代表可以继续查询学生信息表中的其他学生信息'
FETCH next FROM stu_cursor '游标继续执行下一行,begin语句'
INTO @NAME 
end
close stu_cursor'关闭游标'
deallocate stu_cursor '释放游标

SELECT name 姓名,sorce 平均分数 FROM #t
drop table #t

猜你喜欢

转载自blog.csdn.net/lj251948/article/details/81052856
今日推荐