初识Mysql存储过程

来源:互联网 发布:stussy淘宝哪家正 编辑:程序博客网 时间:2024/06/18 10:55

mysql存储过程简单介绍参见:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html

笔者使用的是SQLyog管理工具,具体的业务需求如下:

现有72万文章数据paper_class_title_word,有id,title,class,class2等字段,现需要将按照class2分组,每个组取1000个数据到新的表paper_class_title_word_1000中。

首先需要用到的第一个存储过程是:

DELIMITER //CREATE PROCEDURE Select_1000_row_to_new_talbe(IN Inclass2 VARCHAR(255),IN Cnt INT)BEGIN   INSERT INTO paper_class_title_word_1000(old_id,title,class,class2) SELECT old_id,title,class,class2 FROM paper_class_title_word WHERE class2 = Inclass2 ORDER BY id LIMIT Cnt;END;//

参数Inclass2 是class2的值,Cnt是需要移动的数据个数。

注意:DELIMITER // 的意思是将//作为语句结束位置,如果不使用该语句,则会报错,因为mysql默认碰到“分号——;”就会去执行。

为了将每个类都执行相应的操作,则需要使用循环来完成,为了方便获取循环中的class2参数值,将72万文章数据进行组合并导入到一个新表中paper_class2_cnt。

INSERT INTO paper_class2_cnt(class2,cnt) SELECT class2,COUNT(class2) FROM paper_class_title_word GROUP BY class2 ORDER BY COUNT(class2) DESC


部分数据如下,


这样就可以利用i来循环 ,根据每个i来取class2的值。

于是有了第二个存储过程:

DELIMITER //CREATE PROCEDURE Select_1000_row_to_new_table_all()BEGIN   DECLARE i INT;      SET i = 0;   LOOP_LABLE:LOOPSELECT class2 FROM paper_class2_cnt WHERE id = i INTO @tempClass;CALL Select_1000_row_to_new_talbe(@tempClass, 1000);   SET i=i+1;   IF i > 119 THEN   LEAVE LOOP_LABLE;   END IF;   END LOOP;END;//


其中@tempClass是用户变量,直接使用 Declare 申明tempClass 并不可以。


笔者目前还不知道有没有类似容器或者数据集之类的东西,也就是可以保存符合条件的所有的class2的值,那样就必使用id来取class2的值,直接遍历结果集就可以了。

通过本次尝试,感受到了mysql存储过程的强大,在之前很多这样的任务都是使用程序实现的,和存储过程比较起来,麻烦多了。

1 0