SQL server 游标(只进游标)讲解
游标概念:
SQL的游标是一种临时的数据库对象,既可以存放储存在数据库表中数据行的副本,也可以指向储存在数据库中的数据行的指针,游标提供了在逐行的基础上操作表中数据的方法。
游标的作用:
1.定位到结果集中的某一行;
2.对当前位置的数据进行读写;
3.保存查询结果,以便下次有需要查询时使用,游标的结果集是有select 语句产生,如果处理过程中需要重复使用一个记录集,那么创建一次游标而重复使用若干次,比重复查询数据库要快得多。
游标的生命五大周期-:
1.声明游标
declare People_cursor cursor local --局部 ,global 全局游标
for
--查询 T-SQL
SELECT PepoleID, DepartmentId, PepoleName ,PepoleAddress from dbo.People
where PepoleID >10
2.打开游标
open People_cursor
3.提取数据
fetch next from @varpepole into @PepoleID ,@DepartmentId , @PepoleName ,@PepoleAddress --into 赋值
while @@FETCH_STATUS = 0 --等于 0 或者等于 1 判断是否成功
begin
print cast(@PepoleID as varchar) + ','+ convert(varchar,@DepartmentId)+@PepoleName+','+@PepoleAddress;fetch next from @varpepole into @PepoleID ,@DepartmentId , @PepoleName ,@PepoleAddress
end
4.关闭游标
close People_cursor (游标名称)
5.释放游标
deallocate People_cursor(游标名称)
只进游标:
特点: 只进游标不支持滚动,支持从头到尾提取数据,数据库执行增删改,在提取时是可见的,但由于该游标只能进不能向后滚动,所以在行提取后对行做增删改是不可见的
案例:
fetch next from @varpepole into @PepoleID ,@DepartmentId , @PepoleName ,@PepoleAddress --into 赋值 (提取数据 fetch 语法)
while @@FETCH_STATUS = 0 --等于 0 或者等于 1 判断是否成功
begin
print cast(@PepoleID as varchar) + ','+ convert(varchar,@DepartmentId)+@PepoleName+','+@PepoleAddress;
if @PepoleID = 10
update dbo.People set PepolePhone = 11111 where PepoleID = 12
if @PepoleID = 12
update dbo.People set PepolePhone = 222222 where PepoleID = 10
fetch next from @varpepole into @PepoleID ,@DepartmentId , @PepoleName ,@PepoleAddress
end
从两个 if 语句可以看到 受影响的列为 提取时,提取后的结果是看不见的,为什么我的查询结果都没有看见 没因为 我没有把 PepolePhone 设置为获取游标值,如果设置了就可以明显看到数据更新显示上的差异
总结:
- Local:作用域为局部,只在定义它的批处理,存储过程或触发器中有效。
- Global:作用域为全局,由连接执行的任何存储过程或批处理中,都可以引用该游标。
- @@FETCH_STATUS: 返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。
@@FETCH_STATUS = 0 /1/2
0 FETCH 语句成功。
-1 FETCH 语句失败或此行不在结果集中。
-2 被提取的行不存在
本文部分存在转载,主要目的:解决学术问题,为学习用户提供更为精准,便于理解的概念与方法,如果有侵权,请联系删除
SQL server 游标(只进游标)讲解
游标概念:
SQL的游标是一种临时的数据库对象,既可以存放储存在数据库表中数据行的副本,也可以指向储存在数据库中的数据行的指针,游标提供了在逐行的基础上操作表中数据的方法。
游标的作用:
1.定位到结果集中的某一行;
2.对当前位置的数据进行读写;
3.保存查询结果,以便下次有需要查询时使用,游标的结果集是有select 语句产生,如果处理过程中需要重复使用一个记录集,那么创建一次游标而重复使用若干次,比重复查询数据库要快得多。
游标的生命五大周期-:
1.声明游标
declare People_cursor cursor local --局部 ,global 全局游标
for
--查询 T-SQL
SELECT PepoleID, DepartmentId, PepoleName ,PepoleAddress from dbo.People
where PepoleID >10
2.打开游标
open People_cursor
3.提取数据
fetch next from @varpepole into @PepoleID ,@DepartmentId , @PepoleName ,@PepoleAddress --into 赋值
while @@FETCH_STATUS = 0 --等于 0 或者等于 1 判断是否成功
begin
print cast(@PepoleID as varchar) + ','+ convert(varchar,@DepartmentId)+@PepoleName+','+@PepoleAddress;fetch next from @varpepole into @PepoleID ,@DepartmentId , @PepoleName ,@PepoleAddress
end
4.关闭游标
close People_cursor (游标名称)
5.释放游标
deallocate People_cursor(游标名称)
只进游标:
特点: 只进游标不支持滚动,支持从头到尾提取数据,数据库执行增删改,在提取时是可见的,但由于该游标只能进不能向后滚动,所以在行提取后对行做增删改是不可见的
案例:
fetch next from @varpepole into @PepoleID ,@DepartmentId , @PepoleName ,@PepoleAddress --into 赋值 (提取数据 fetch 语法)
while @@FETCH_STATUS = 0 --等于 0 或者等于 1 判断是否成功
begin
print cast(@PepoleID as varchar) + ','+ convert(varchar,@DepartmentId)+@PepoleName+','+@PepoleAddress;
if @PepoleID = 10
update dbo.People set PepolePhone = 11111 where PepoleID = 12
if @PepoleID = 12
update dbo.People set PepolePhone = 222222 where PepoleID = 10
fetch next from @varpepole into @PepoleID ,@DepartmentId , @PepoleName ,@PepoleAddress
end
从两个 if 语句可以看到 受影响的列为 提取时,提取后的结果是看不见的,为什么我的查询结果都没有看见 没因为 我没有把 PepolePhone 设置为获取游标值,如果设置了就可以明显看到数据更新显示上的差异
总结:
- Local:作用域为局部,只在定义它的批处理,存储过程或触发器中有效。
- Global:作用域为全局,由连接执行的任何存储过程或批处理中,都可以引用该游标。
- @@FETCH_STATUS: 返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。
@@FETCH_STATUS = 0 /1/2
0 FETCH 语句成功。
-1 FETCH 语句失败或此行不在结果集中。
-2 被提取的行不存在
本文部分存在转载,主要目的:解决学术问题,为学习用户提供更为精准,便于理解的概念与方法,如果有侵权,请联系删除