我在学习游标的时候,在对游标运行逻辑一知半解的情况下写了个游标的存储过程,而且是三个游标的嵌套(因为我也兼职代码程序开发,所以一眼看下来感觉跟for循环差不多,就可以着手了)。结果一口气写完,完了,出错了,出什么错了,下面↓
fetch next from order_cursor into @temp
我当初就是以为他在取值的同时continue,当时还为这个东西惑惑不解了大半天,东问西问。
后面研究发现这句话的作用仅仅是负责取游标容器中的下一个值,是用来取值的,取值的,他并不负责回到游标最上层,
哇,现在想起来也太丢人了。
其实我感觉游标循环是可以分为两部分去理解的,第一部分就是游标,第二部分就是循环↓
详解:
DECLARE cursor CURSOR FOR SELECT * FROM TABLE --定义游标容器,并且赋予其数据
OPEN cursor -- 打开容器
DECLARE @A --定义变量@A,用来接纳游标容器中的某一行的某一个字段值,存储过程常用函数。
FETCH NEXT FROM cursor INTO @A --将游标容器中,第一行数据的值赋值给@A
WHILE @@FETCH_STATUS=0 --判断是否取值成功,如果成功则 @@FETCH_STATUS为0,如不成功则为-1.
BEGIN --开始WHILE 循环
。。(处理逻辑)
FETCH NEXT FROM cursor INTO @A --在结束循环前取游标容器的下一行值
END --结束循环
CLOSE cursor --关闭游标容器,有打开则有关闭,有始有终
DEALLOCATE cursor --释放游标资源,做完我们要的东西后清理垃圾,学过c语言的同学应该知道,需要释放资源,这里同理。
↑这里就完成了游标循环
小提示:
在sqlserver存储过程中,我们常常会用到临时表 #t 用来方便数据查询,而用完后,对于临时表的删除是非常必要的,不然在上千行的存储过程写完后,再去回过头删除时非常痛苦的一件事情,所以各位同学警记,下面是删表的逻辑判断:
IF object_id('tempdb..#a') is not null
begin
drop table #a
end
而drop table 是非常危险的一个动作,如果你写成了实体表还运行了,那就跑路吧,至于怎么跑路,我建议你看一本书《入职三天,从删库到跑路》
so good,各位一起Upup!
(责任编辑:IT) |