Mysql游标和循环

来源:互联网 发布:深海鱼油 知乎 编辑:程序博客网 时间:2024/06/05 00:36

继续讲述小菜鸟跟Mysql的那些事~~前几天接到这样一个需求:将数据库中每天符合条件的记录进行固化,固化的同时需要对数据进行相应的修改和计算。。。

恩,我开始的思路是这样的:每天按照条件对数据库中的数据进行搜索,然后呢?建一个table进行数据的固化,即将选出来的数据插进新建的table里面。想法是简单的,按照程序员最简单的思维:记录不只是一条吧?那就肯定要写个循环啊!在C++神马的编程语言中,循环就是申请个小变量,然后在循环体中每次+1,直到变量超过预定的范围,then停止循环,具体就不写了,你们懂得。

可是当我在Mysql中试图写一个这样的while。。。我得知了在Mysql的存储过程中写循环需要与游标配合才能生效啊!唔,游标是什么呢?现在,我觉得它就是一个小光标,想象一下,他就在我们select出来的记录旁边从指向第一条开始,我们对本条数据进行处理,处理结束后小光标移动到了下一条记录,是不是很有条理?反正我感觉它大大的符合了我的需求。

问题:那我们要不要考虑记录的数量?游标需要下移几次呢?答:这个问题不需要我们考虑,我们只需要设置一个标志,当光标找不到记录的时候自动结束循环,很cool吧!

下面开始游标的建立和使用:


定义游标:

DECLARE cur_1 CURSOR FOR 
SELECT ...
FROM ...
WHERE ...

定义标志:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;

打开游标:

open cur_1;、

FETCH cur_1 INTO...

(注意:若在程序中需要对记录中的属性进行处理啊计算啊,那么必须在此之前declare好需要的变量,在之后的程序中对变量进行处理。我这个需求就是这样的,需要进行新一轮的insert 到new table啊)

循环体:

while b <> 1

...

(假设我新建的表名是newtable那么,我要进行insert啦)

INSERT INTO newtable (属性1,属性2,属性3) VALUES (值1,值2,值3);

(在这里,我必须坦白自己犯下的一个超级大的错误,也作为给大家的警示了。。由于自己的粗心,在这个插入语句中,前后的属性和值的数目没有匹配,结果。。。进入了死循环。。!抓狂关键是还没有报错啊!有木有!!大哭瞬间向数据库中插入几千万条记录,吓坏我了有木有惊恐!!还有一个更恐怖的情况,truncate表之后再进行count操作,华丽丽又是N条记录啊。。发火。。最后发现因为是因为我的粗心造成的。。好伤感,程序员是个细致活,以后绝对不能犯这种低级错误了!)


获取下一条记录:

FETCH cur_1 INTO ...

  
结束循环:

END WHILE;  


关闭游标:
CLOSE cur_1;

就是这样简单的一个过程便可以实现一个选择数据,然后插入的过程,恩,继续努力吧!奋斗 



原创粉丝点击