排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
分类:
数据库
什么是游标:
游标类似于一个指针,游标就是把数据结果放到内存中,然后游标指向这个内存地址
作用:
可以让我们一行一行的去处理数据, 类似c# ado.net SqlDataReader 可以提供一行一行的读取数据
可以把游标理解成数据库中的SqlDataReader,这样就可以在数据库中处理一些比较复杂的逻辑
使用游标的步骤:
1:创建游标 declare 游标名字 cursor for ....接语句
2:打开游标 open 游标名字
3:查询游标(可以是遍历) fetch next from 游标名称 into 变量
4:关闭游标 close 游标名字
5:删除游标 deallocate 游标名字
@@fetch_status:查询游标有没有读完,如果是-1就说明游标读完了,
注意:游标打开的初始@@fetch_status也是等于-1,没有读取的时候是-1,读取完了也是-1
游标的分类:
静态游标和动态游标
动态游标:主表数据变了, 游标数据会跟着变
静态游标:主表数据变了, 游标数据不会跟着变
游标的简单使用:
select * from UserInfo --1:创建游标 declare mycursor cursor for select username ,number from UserInfo --2:打开游标 open mycursor declare @username varchar(64),@number varchar(64),@beforename varchar(64) --3:查询游标 --fetch next from mycursor into @username,@number --print(@username+':'+@number) --3-1:循环遍历这个游标 fetch next from mycursor into @username,@number --print(@username+':'+@number) print(@@fetch_status) while @@fetch_status!=-1 begin --取游标的数据 update UserInfo set UserName='张辽' where Id = 4 print(@username+':'+@number) fetch next from mycursor into @username,@number --查询原表数据 --select @beforename = username from UserInfo where Id = 4 --print(@username+':'+@beforename) end --关闭游标 close mycursor --删除游标 deallocate mycursor
游标实现薪资添加:
游标实现工资的添加,比如有一张原始工资表,还有一张对应需要添加薪水的表,我们可以利用游标能一行一行处理数据的能力轻松的实现
表结构如下:
--原始工资表 create Table Account ( Id int primary key identity(1,1), MyMoney int, AccountNumber nvarchar(64) ) insert Account values(1000,'60023') insert Account values(1000,'60025') insert Account values(1000,'60026') --需要添加工资的表 create Table AddAccount ( Id int primary key identity(1,1), AddMoney int, AccountNumber nvarchar(64) ) insert AddAccount values(2000,'60023') insert AddAccount values(200,'60025') insert AddAccount values(500,'60026')
游标的实现如下:
create proc proc_addsalary as begin --处理涨工资的游标 declare add_salary cursor for select AddMoney,AccountNumber from AddAccount open add_salary declare @AddMoney int ,@AccountNumber nvarchar(64) --循环处理 fetch next from add_salary into @AddMoney,@AccountNumber while @@FETCH_STATUS!=-1 begin --更新原表 update Account set MyMoney = MyMoney+@AddMoney where AccountNumber = @AccountNumber --才能一行一行的读取 fetch next from add_salary into @AddMoney,@AccountNumber end close add_salary deallocate add_salary end
使用游标分等级涨的薪资:
根据用户绩效表实现添加工资
用户绩效考核(KPI)在60分以下就不涨工资,如果成绩在60-80加1000,如果在80以上加2000
多一张绩效表:
--绩效表 create Table KPI ( Id int primary key identity(1,1), Score int, AccountNumber nvarchar(64) , KPIType int --状态为1表示没有增加过薪资 ) insert KPI values(58,'60023',1) insert KPI values(90,'60025',1) insert KPI values(70,'60026',1)
实现代码如下:
declare dec_KPI cursor for select AccountNumber ,Score,KPIType FROM KPI open dec_KPI --定义变量 存放需要涨得工资 用户名 declare @KPI int ,@KPI_score int,@KPI_AccountNumber nvarchar(64),@upMoney int =0 fetch next from dec_KPI into @KPI_AccountNumber, @KPI_score,@KPI --循环输出 while @@FETCH_STATUS=0 begin print(@KPI) --判断状态是否为1则加工资 if(@KPI=1) begin --判断涨工资多少 if (@KPI_score>=60 and @KPI_score<=80 ) begin set @upMoney=1000 end if (@KPI_score>80) begin set @upMoney=2000 end --更新原表 update Account set MyMoney = MyMoney+@upMoney where AccountNumber = @KPI_AccountNumber update KPI set KPIType = 0 where AccountNumber = @KPI_AccountNumber end else begin print('绩效已核算!!!') --print(@KPI_AccountNumber+ ':'+@KPI_score +':'+@KPI) --一行一行的读取 end fetch next from dec_KPI into @KPI_AccountNumber, @KPI_score,@KPI end --关闭 删除 close dec_KPI deallocate dec_KPI
欢迎加群讨论技术,群:677373950(满了,可以加,但通过不了),2群:656732739
评价