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;

浙公网安备 33010602011771号