关系数据库的大部分管理操作都与Transact-SQL中的查询语句SELECT有着密切的联系。SELECT语句一般返回的是包含多条记录的、存放在客户机内存中的结果集。当用户需要访问一个结果集中的某条具体记录时,就需要使用游标功能。
作为全局游标,一旦被创建就可以在任何位置上访问,而作为局部游标则只能在声明和创建的函数或存储过程中对它进行访问。当多个不同的过程或函数需要访问和管理同一结果集时,应使用全局游标。
而局部游标管理起来更容易一些,因而其安全性也相对较高。局部游标可以在一个存储过程、触发器或用户自定义的函数中声明。由于其作用域受存储过程的限制,所以在自身所处的过程中对游标的任何操作都不会对其他过程中声明的游标产生影响。
(个人理解游标就是循环)
举例子:
下个月的期初金额就是上个月的现存金额
最终效果
DECLARE @年月 varchar(6)
DECLARE @id varchar(6)
declare @客户 nvarchar(20)
declare @金额 decimal(18,4)
declare @期初金额 decimal(18,4)
DECLARE @入账金额 decimal(18,4)
---创建游标
DECLARE CUR_YFK CURSOR LOCAL FORWARD_ONLY DYNAMIC
FOR
SELECT * FROM 预付款
order by 年月
---打开游标预付款
open CUR_YFK
FETCH FROM CUR_YFK into @年月 , @id ,@客户 , @金额
while @@fetch_status=0 --判断是否成功获取数据
begin
set @期初金额 = (select 现存金额 from 现存预付款
where 年月 = @年月-1
and 客户 = @客户)
---获取下月期初金额
print @期初金额
if (select max(年月) from 现存预付款 ) < @年月
begin
insert into 现存预付款 values (@年月,'' ,@客户 , @期初金额 ,0,0)
end
else
begin
print '' end
update 现存预付款 set 入账金额 = @金额
where 年月 = @年月
and 客户 = @客户
update 现存预付款 set 现存金额 = 期初金额+入账金额
print '执行成功'+@年月 --进行相应处理(跟据需要填入SQL文)
fetch next from CUR_YFK into @年月 , @id ,@客户 , @金额 --将游标向下移1行
end
close CUR_YFK --关闭游标
deallocate CUR_YFK ---释放游标
参考代码如上。