传入的数据都是查询的条件:开始时间(如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条记录的时候就不再插入数据。
这个存储过程如何写呢?

解决方案 »

  1.   


    CREATE PROCEDURE `new_proc3`(IN tablename VARCHAR(50))
    BEGIN
        set @sqltext:=concat('select * from ',tablename);
        prepare stmt from @sqltext;
        EXECUTE stmt;
    END;这个是动态读表的存储过程,可以参考一下,不过我是很不赞成lz的这种n多表的设计,感觉上这种设计很有缺陷。
      

  2.   


    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 ;
      

  3.   

    谢谢楼上的2位仁兄回1楼:因为每天的数据量是以几十万条计算的,故只能做分表,因为实验过,当数据达到几千万条的时候由于数据量太大,只做个简单的查询都需要很长时间,最后可能导致网页都无法显示。而且整个系统已经设计成这样,无法改变的。回2楼:不好意思,没有说清楚表的设计,目前表的设计是每天产生一张表,表名以日期为单位,这样的话肯定会出现log20080131后面的就是log20080201这个表,而且当天的数据是存放在表名为"log"表内,而数据库里开始的表并不是固定的,就是说有可能开始查询的时间,那天的表并不存在,如查询时间从2007-12-21日开始,但表只有log20080101以后的,这样的话就很麻烦了。这样我只能是用show tables先获得由多少表名,然后再做数据的查询及插入,这样的话不知道如何去写。
    希望大家帮个忙,因为实在是想不出来如何去做,先谢谢了!
      

  4.   

    如查询时间从2007-12-21日开始,但表只有log20080101以后的,这样的话就很麻烦了。
    =============
    要靠表名判断这个好像有点麻烦。可不可以建一个表,里面放已经有表的日期,然后判断这个表决定日期范围,在用上面的存储过程。