说说 SQL 游标好了
其实跟数据库交互不只有增删改查。增删改查是基础。如果连这都掌握不明白,那只能说这个程序员不合格。本文说说 SQL 游标。
可以把游标理解成是指针。内存中都指针指向的是一个十六进制的地址。可以粗浅地认为,指针指向内存中的一个个小格子。游标指向一行数据。
许多大型关系型数据库都支持 SQL 游标。比如SQL Server,Orancle,Mysql。其中 SQL Server 中的游标如此使用。
-- 声明游标
declare AsmaCurrentCursor cursor scroll
for select EndTime from view_result where ChannelName = 'AsamaCurrent'
-- 打开游标
open AsmaCurrentCursor
-- 声明变量
declare @EndTime datetime, @OldEndTime datetime
-- 移动游标取出结果中的第一行数据
fetch first from AsmaCurrentCursor into @EndTime
set @OldEndTime = @EndTime
-- 循环执行操作
-- 移动游标未发生异常时循环。换句话说,若游标移动时发生异常,就跳出循环
while @@FETCH_STATUS = 0
begin
-- 移动游标,并给变量赋值
fetch next from AsmaCurrentCursor into @EndTime
-- 其它操作
update view_result set EndTime = DATEADD(MINUTE, 1, @OldEndTime) where Current of AsmaCurrentCursor
set @OldEndTime = DATEADD(MINUTE, 1, @OldEndTime)
end
-- 关闭游标
close AsmaCurrentCursor
-- 释放掉游标资源
deallocate AsmaCurrentCursor
上面 SQL 的作用就是以 EndTime 列首行记录的时间值为参考,逐行把日期增加一分钟。
![8bd6944372f1a537954002571b868448.png](https://i-blog.csdnimg.cn/blog_migrate/b7792159a82b550da42d0e277cddd5b4.jpeg)
如果你仔细体会上述 SQL,你就已经掌握了游标。
写到这里,如果你还不了解 SQL 游标,没关系。因为我写这篇文章目的也不是教你学这个。我要说的是:
1、SQL 并不只有增删改查,可玩的东西挺多的。
2、能在 SQL 里实现的东西,就不要让你的程序去做。尽量让程序获取最终结果,而不是再计算。
3、使用游标会降低查询效率,如无必要,不要使用游标。
这就是我的一点经验。