传入的数据都是查询的条件:开始时间(如2008-01-02 23:12:21)、结束时间(如2008-01-05 01:12:21),人名,性别等等
有很多表如:log20080101,log20080102,log20080103,log20080104,log20080105,log20080106.....
这样的话,需要查询的表有log20080102,log20080103,log20080104,log20080105四个表
需要在这些表内读取符合查询条件的数据存入logtemp表内,当logtemp表内数据达到1W条记录的时候就不再插入数据。
这个存储过程如何写呢?
有很多表如:log20080101,log20080102,log20080103,log20080104,log20080105,log20080106.....
这样的话,需要查询的表有log20080102,log20080103,log20080104,log20080105四个表
需要在这些表内读取符合查询条件的数据存入logtemp表内,当logtemp表内数据达到1W条记录的时候就不再插入数据。
这个存储过程如何写呢?
CREATE PROCEDURE `new_proc3`(IN tablename VARCHAR(50))
BEGIN
set @sqltext:=concat('select * from ',tablename);
prepare stmt from @sqltext;
EXECUTE stmt;
END;这个是动态读表的存储过程,可以参考一下,不过我是很不赞成lz的这种n多表的设计,感觉上这种设计很有缺陷。
DELIMITER $$DROP PROCEDURE IF EXISTS `test`.`sp_insert_temp`$$CREATE PROCEDURE `test`.`sp_insert_temp`(
IN db_name varchar(64), IN start_date datetime, IN end_date datetime)
BEGIN
declare i int;
declare num int;
create temporary table if not exists logtemp(id int not null);
set @stmt = concat('select count(*) from information_schema.TABLES where TABLE_SCHEMA = ''',db_name,''' and substr(table_name,4) between ''',replace(date(start_date),'-',''),''' and ''',replace(date(end_date),'-',''),''' into @cnt');
prepare s1 from @stmt;
execute s1;
drop prepare s1;
set @stmt = '';
set i = 0;
while i < @cnt
do
set @stmt = concat('select table_name from information_schema.TABLES where TABLE_SCHEMA = ''',db_name,''' and substr(table_name,4) between ''',replace(date(start_date),'-',''),''' and ''',replace(date(end_date),'-',''),''' limit ',i,',1 into @t_name');
prepare s1 from @stmt;
execute s1;
drop prepare s1;
set @stmt = '';
select count(1) from logtemp into num;
if num < 10000 then
set @stmt = concat('insert into logtemp select * from ',@t_name);
prepare s1 from @stmt;
execute s1;
drop prepare s1;
set @stmt = '';
end if;
set i = i + 1;
end while;
END$$DELIMITER ;
希望大家帮个忙,因为实在是想不出来如何去做,先谢谢了!
=============
要靠表名判断这个好像有点麻烦。可不可以建一个表,里面放已经有表的日期,然后判断这个表决定日期范围,在用上面的存储过程。