mysql 存储过程示例1

mysql 存储过程示例:

该存储过程用来将原有未分表的数据迁移到对应子表中

p_baseTable  基表,p_baseCol  数据分发基于那个字段(必须是日期字段),p_year p_month 起始年月
 1 delimiter $$
 2 create procedure shardingTable(IN p_baseTable char(80),IN p_baseCol char(80),IN p_year int,IN p_month int)
 3 begin
 4     declare v_year int default p_year;
 5     declare v_month int default p_month;
 6     declare v_strYear char(4);
 7     declare v_strMonth char(2);
 8     declare v_strYearMonth char(6);
 9     
10     declare v_cur_year int;
11     declare v_cur_month int;
12     declare v_subTable varchar(80);
13     
14     declare v_strSTMT varchar(300);
15     
16     select year(now()) into v_cur_year;
17     select month(now()) into v_cur_month;
18     SHARDING_TABLE_DATE:loop
19         if v_year>v_cur_year or (v_year=v_cur_year and v_month>v_cur_month)then
20             leave SHARDING_TABLE_DATE;
21         end if;
22         select CAST(v_year as char) into v_strYear;
23 
24         if v_month>9 then
25             set v_strMonth=CAST(v_month as char);
26         else
27             set v_strMonth=concat('0',CAST(v_month as char));
28         end if;
29 
30         set v_strYearMonth=concat(v_strYear,v_strMonth);
31         
32         set v_subTable=concat(p_baseTable,'_',v_strYearMonth);
33         set v_strSTMT=concat(" insert into ",v_subTable," select * from ",p_baseTable," where DATE_FORMAT(",p_baseCol,",'%Y%m')=? ;");
34         set @v_temp = v_strSTMT;
35         set @v_temp2 = v_strYearMonth;
36         -- select v_strSTMT;
37         
38         prepare myStmt from @v_temp; -- 不知道为什么这里不能直接使用 v_strSTMT,在编写时,使用v_strSTMT会使创建过程失败
39         execute myStmt using @v_temp2; -- v_strYearMonth 同上
40         deallocate prepare myStmt;
41         
42         set v_month=v_month+1;
43         if v_month>12 then
44             set v_year=v_year+1;
45             set v_month=1;
46         end if;
47         
48     end loop;
49 end$$
50 
51 delimiter ;
52 
53 call shardingTable('xxx','DATE_UPDATED',2017,7);
54 call shardingTable('xxx','logCreateDate',2017,7);
55 call shardingTable('xxx','DATE_CREATED',2017,9);
56 
57 drop procedure shardingTable;

 

posted @ 2018-11-08 16:56  缘来就是你  阅读(114)  评论(0)    收藏  举报