游标操作的六步骤:
◆在每次在创建游标的时候都问问自己,用什么别的方法可以避免使用游标,那么你就步如设计的正规了.
1.声明
2.打开
3.应用/操作
4.关闭.
5.释放
声明游标的基本语法如下:
Declare <cursor name> cursor
For <select statement>
案例1: MySchool
if exists(select * from sysobjects where name='cursc')
drop proc cursc
Go
create procedure cursc
as
declare
@question varchar(210), --我们必须声明变量来存放得到的记录
@a varchar(50),
@b varchar(50),
@c varchar(50),
@d varchar(50),
@answer varchar(50),
@num int
declare MyCursor cursor --声明我们的游标
Global --全局 游标的范围还有一个是局部(Local)
for select question ,OptionA,OptionB,OptionC,OptionD,Answer from question --对应的sql语句 后面打开游标就是打开
set @num=1 --设置标量表示游标的移动
open MyCursor --打开我们的游标这实际执行了For从句的主体查询,但我们仍然没有将数据
--放在合适的位置进行合适的处理,因此我们需要处理一组事情.
--1.获取第一条理路或者Fetch
--2.根据需要,循环剩余记录
fetch next from MyCursor into @question,@a,@b,@c,@d,@answer
--首先生成第一条Fetch(提取)--该命令说明了希望提取一条特定的的记录,得到的记录由变量接受
print '第'+cast(@num as varchar)+'个问题:'+' 答案A是'+@a+' 答案B是'+@b+' 答案C是'+@c+' 答案D是'+@d++' 正确答案是'+@answer
--对得到的记录进行对应操作(第一次) --如果忘了再这里进行操作那么会少操作一行数据
while (@@fetch_status=0) --@@fetch_status全局变量,每次提取一行,该变量就更新一次
--并告诉我们提取工作进展到了哪一步.他可能值为以下项
--□ 0:提取成功,一切进展顺利 ||语句成功
--□ -1:提取失败或此行不在结果集中,超出了游标中的最后一行(或在第一行之前) ||Fetch语句失败或行不在结果集中
--□ -2:提取失败,被提取的行不存在,因为记录丢失(不是循环到了末尾,而是因为在游标打开时已经删除了该记录) || 提取的行不存在
begin
select @num=@num+1
fetch next from MyCursor into @question,@answer
--上面的fetch进行操作一行数据 那么循环也要进行操作记住有次fetch 和2次操作语句块
print '第'+cast(@num as varchar)+'个问题:'+' 答案A是'+@a+' 答案B是'+@b+' 答案C是'+@c+' 答案D是'+@d++' 正确答案是'+@answer
end
close MyCursor --关闭游标
deallocate MyCursor --释放游标
基本操作上面案例已经很清楚了
范围:
局部(Local)与全局(Global) 选项决定了游标的范围,也就是说,连接和处理可以看见的游标
区别:
全局(Global):
局部(Local)
:作用于当前查询语句块 其他地方不能被使用
滚动性:
1. 只向前: 由字面意思就可以看出,他的选项就是Fetch Next
a) 在移动到下一条记录之前,你需要处理提取的每一条记录,因为一旦该记录消失了,就在也不能返回到以前的记录了,除非关闭并且重新打开游标
b) 他与普通的select 语句相似 都只能由上往下瀑布模型 不能返回
2. 可滚动
a) 你可以根据需要滚动游标向前或者向后
b) 滚动的基础是Fetch关键词. 你可以使用Fetch镶嵌或向后移动游标,也而已在移动到特定的位置.
c) Fetch的主要参数如下:
1:Next 移动到下一条记录
2:Prior 移动前一条记录:
当我们跳转了最后一行 从后往前运行
fetch prior from MyCursor into @question,@answer
3:First 移动到第一条记录
4:Last 移动到最后一条记录
5:Absolute 跳转到第几行数据
--指向第几行数据,正数代表从开始到第行数据,-2代表从末尾开始倒数第行
fetch ABSOLUTE 2 from Employee_Cursor;
--从游标现在所在位置开始,指向第几行
fetch RELATIVE 2 from Employee_Cursor
6:指向第几行
--从游标现在所在位置开始,指向第几行
fetch RELATIVE 2 from Employee_Cursor
游标类型:
□:静态型
□:键集驱动型
□:动态型
□:只快速向前行
□:静态型
:静态游标 对数据进行更改,并不会影响基表的数据
declare MyCursor cursor --声明我们的游标
Global
Scroll --可滚动
Static --静态的,
for select question ,Answer from question
□:键集驱动型
:略 不明白
□:动态型:
: declare MyCursor cursor --声明我们的游标
Global
Scroll --可滚动
Dynamic --动态
for select question ,Answer from question
□:只快速向前行 Fast Forward cursor
:
案例②:
/*游标实现分页局限版*/
--得到1-10条的记录
use pubs
Go
if exists(select * from sysobjects where name='proc_fenye2')
drop procedure proc_fenye2
GO
create proc proc_fenye2
as
declare mycur cursor
global
scroll
for
select * from jobs
open mycur
declare @ID int,@job nvarchar(100),@min int,@max int,@leijia int
set @leijia=0
fetch absolute 5 from mycur into @ID,@job,@min,@max
select cast(@ID as varchar),cast(@min as varchar),cast(@max as varchar)
while (@@fetch_status=0 and @leijia<5)
begin
set @leijia =@leijia+1
fetch next from mycur into @ID,@max
select cast(@ID as varchar),cast(@max as varchar)
end
close mycur
deallocate mycur
Go
游标的一些基本操作:
--声明一个滚动游标
DECLARE Employee_Cursor SCROLL CURSOR FOR
SELECT LastName, FirstName
FROM Employees
--打开游标
OPEN Employee_Cursor;
--声明两个变量存储游标中获取的数据
declare @lastname varchar(20),@firstname varchar(20)
--游标指向下一行数据
FETCH next FROM Employee_Cursor
--存入变量
into @lastname,@firstname
--查看变量结果
print @firstname+' '+@lastname
--游标状态,表示有下一行数据,-1代表无下一行数据
print @@FETCH_STATUS
--游标指向第一行数据
fetch first from Employee_Cursor;
--游标指向上一行数据
fetch prior from Employee_Cursor;
--游标指向最后一条数据
fetch last from Employee_Cursor;
--指向第几行数据,正数代表从开始到第行数据,-2代表从末尾开始倒数第行
fetch ABSOLUTE 2 from Employee_Cursor;
--从游标现在所在位置开始,指向第几行
fetch RELATIVE 2 from Employee_Cursor
--循环读取所有数据
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM Employee_Cursor
END;
--关闭游标
CLOSE Employee_Cursor;
--删除游标
deallocate Employee_Cursor;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。