继续讲述小菜鸟跟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;
就是这样简单的一个过程便可以实现一个选择数据,然后插入的过程,恩,继续努力吧!