目录

​1.为什么要使用游标​

​2.游标的定义​

​3.使用游标的步骤​

​3.1声明游标​

​3.2打开游标​

​3.3推进游标指针并取当前记录​

​3.4关闭游标​

​3.5删除游标​

​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;

sql 游标_sql

exec pro1;-- 只统计女生 --执行结果 --------数据库 成绩单-------- 第1名 韩菱纱 女95 第2名 王敏 女94 第3名 刘晨 女92