> 数据库 > MySQL >

存储过程——游标循环

我在学习游标的时候,在对游标运行逻辑一知半解的情况下写了个游标的存储过程,而且是三个游标的嵌套(因为我也兼职代码程序开发,所以一眼看下来感觉跟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)