游标(cursor)
游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理,语言是面向记录的,一组主变量一次只能存放一条记录,使用主变量并不能完全满足SQL语句向应用程序输出数据的要求。
嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式,在数据库开发过程中,当我们检索的数据只是一条记录时,我们所编写的事务语句代码往往使用SELECT INSERT 语句。但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢?游标为我们提供了一种极为优秀的解决方案。
游标的使用:主要分四步即定义——打开——推进——关闭(删除)
(1)说明游标
用DECLARE语句为一条SELECT语句定义游标:
EXEC SQL DECLARE<游标名>CURSOR FOR<SELECT语句>;
(2)打开游标
用OPEN 语句将定义的游标打开:
EXEC SQL OPEN <游标名>
(3)推进游标指针并取当前记录:
EXEC SQL FETCH<游标名>
INTO <主变量>[<指示变量>],[,<主变量>[<指示变量>]]...;
其中主变量必须与select语句中的目标列表达式具有一一对应的关系。
使用fetch语句把游标指针向前推进一条记录,同时将缓冲区中的当前记录取出来送至主变量供主语言进一步处理。通过循环执行fetch语句逐条取出结果集中进行处理。
(4)关闭游标——CLOSE
EXEC SQL CLOSE<游标名>;
例:使用游标查询student表中的学生姓名与学生学号
if(exists(select *from sys.object where name='proc_cursor'))
drop procedure proc_cursor
go
create procedure proc_cursor
as
declare @sno char(9)
declare @sname char(20)
declare mycursor cursor for
select sno,sname from student
--声明游标
open mycursor --打开游标
fetch next from mycursor into @sno,@sname
while(@@fetch_status=0)
begin
print '游标成功取出一条数据:'
print @sno
print @sname
print '***********************'
fetch next from mycursor into @sno,@sname
end
close mycursor
deallocate mycursor
go
exec proc_cursor
go
查询结果:
以前爬虫的时候有过接触这部分,不是很难但是很有用处,当时感觉有点乱,不过现在学了就清晰了,四步走记清楚这部分基本就掌握了。