目录
4.游标实例
1.为什么要使用游标
1.SQL语言与主语言具有不同数据处理方式
2.SQL语言是面向集合的,一条SQL语句原则上可以产生或处理多条记录
3.主语言是面向记录的,一组主变量一次只能存放一条记录
4.仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求
5.嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式
2.游标的定义
游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果
每个游标区都有一个名字
用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理
3.使用游标的步骤
1. 说明游标(DECLARE)
2. 打开游标(OPEN)
3. 推进游标指针并取当前记录( FETCH )
4. 关闭游标(CLOSE)
3.1声明游标
使用DECLARE语句
语句格式
(EXEC SQL) DECLARE <游标名> CURSOR
FOR <SELECT语句>;
功能:
是一条说明性语句,这时DBMS并不执行SELECT指定的查询操作。
3.2打开游标
使用OPEN语句
语句格式
(EXEC SQL) OPEN <游标名>;
功能:
打开游标实际上是执行相应的SELECT语句,把所有满足查询条件的记录从指定表取到缓冲区中
这时游标处于活动状态,指针指向查询结果集中第一条记录
3.3推进游标指针并取当前记录
使用FETCH语句
语句格式
(EXEC SQL) FETCH [[NEXT|PRIOR|
FIRST|LAST] FROM] <游标名>
INTO <主变量>[<指示变量>][,<主变量>[<指示变量>]]...;
3.4关闭游标
使用CLOSE语句
语句格式
(EXEC SQL) CLOSE <游标名>;
功能:
关闭游标,释放结果集占用的缓冲区及其他资源
说明:
游标被关闭后,就不再和原来的查询结果集相联系
被关闭的游标可以再次被打开,与新的查询结果相联系
3.5删除游标
deallocate {{ [ global ] 游标名 } | @游标变量名
eg:deallocate mycrsr
4.游标实例
使用游标 逐行按成绩高低输出选修课程的女学生姓名、性别、课程名、成绩
为了方便重复执行,写成存储过程
go create procedure pro1 as declare @vsname char(9),@vsex char(2),@vcname char(20),@vgrade smallint,@vmc smallint select @vcname='数据库' select @vmc=1 -- 名次号变量 print '--------'+@vcname+'成绩单--------' declare mycrsr0 cursor for select sname,ssex,cname,grade from student,course,sc where student.sno=sc.sno and course.cno=sc.cno and ssex='女' and cname=@vcname order by grade desc open mycrsr0 -- 打开游标 fetch next from mycrsr0 into @vsname,@vsex,@vcname,@vgrade while @@FETCH_STATUS=0 begin print '第'+ltrim(str(@vmc))+'名' print @vsname+@vsex+convert(char(6),@vgrade) -- 将vgrade转换为char(6)类型 fetch next from mycrsr0 into @vsname,@vsex,@vcname,@vgrade select @vmc=@vmc+1 end close mycrsr0 -- 关闭游标(若只是关闭 则只是断开了连接 还可以打开) deallocate mycrsr0 -- 删除游标 go
--执行验证
select * from sc; select * from student;
exec pro1;-- 只统计女生 --执行结果 --------数据库 成绩单-------- 第1名 韩菱纱 女95 第2名 王敏 女94 第3名 刘晨 女92