Oracle MySQL动态表的实际解决方案


  本文标签:Oracle MySQL

  下面的文章主要讲述的是Oracle MySQL动态表的实际解决办法,我们大家都知道,CRM需要定期将相关的数据导回到其CRM数据库(目的DB:Oracle;源DB:MySQL);但是因为目前增长量不太大,,,而今后会比较大.由于Oracle MySQL数据库不是我建的  。

  还是决定登上去看一下,主表没有一个字段可以唯一标识一比记录的,也就是说我目前只会面临.我导数据的同时有新的数据录入,明显会出问题.程序员又不在,,,之前一直都只管Oracle,马上要让玩MySQL,看来只得现学现用了,现写一个Oracle MySQL的存储过程来实现.让系统每天产生后一天的表放在那里,系统根据时间的不同,将数据插入不同的表中,以下为实施脚本:

  

  MySQL存储过程事例:

  

  

  1. declare @t_date varchar(20);  
  2. set @t_date = (select concat(readinfo,curdate()+0));  
  3. mysql>delimiter && 

  临时结束符

  1. mysql>create procedure p()   
  2. ->begin   
  3. ->select * from pet;   
  4. ->end;&&   
  5. mysql>delimiter ;   
  6. mysql> call p();  

  自写Oracle MySQL存储过程:

  1. CREATE TABLE readinfo20070726 (  
  2. eid int(11) ,  
  3. guid varchar(36) ,  
  4. ip varchar(20) ,  
  5. date varchar(20),  
  6. bookname varchar(60) ,  
  7. version int(11) ,  
  8. isvip int(11) ,  
  9. vipname varchar(80)  
  10. ENGINE=MyISAM DEFAULT CHARSET=utf8   
  11. CREATE TABLE readinfo20070727 (  
  12. eid int(11) ,  
  13. guid varchar(36) ,  
  14. ip varchar(20) ,  
  15. date varchar(20),  
  16. bookname varchar(60) ,  
  17. version int(11) ,  
  18. isvip int(11) ,  
  19. vipname varchar(80)  
  20. ENGINE=MyISAM DEFAULT CHARSET=utf8   
  21. CREATE TABLE readinfo20070728 (  
  22. eid int(11) ,  
  23. guid varchar(36) ,  
  24. ip varchar(20) ,  
  25. date varchar(20),  
  26. bookname varchar(60) ,  
  27. version int(11) ,  
  28. isvip int(11) ,  
  29. vipname varchar(80)  
  30. ENGINE=MyISAM DEFAULT CHARSET=utf8  

  存储过程:

  

  1. CREATE PROCEDURE sp_readinfo(in eid int,in guid varchar(36),in ip varchar(50))  
  2. NOT DETERMINISTIC  
  3. SQL SECURITY DEFINER  
  4. COMMENT   
  5. BEGIN  
  6. set @table = concat(readinfo,curdate()+0);  
  7. set @temp1 = insert into ;  
  8. set @temp2 = (eid,guid,ip,date) values(;  
  9. set @value1 = eid;  
  10. set @value2 = guid;  
  11. set @value3 = ip;  
  12. set @value4 = now());  
  13. set @sql_text:=concat(@temp1,@table,@temp2,@value1,,,@value2,,,@value3,,,@value4);   
  14. prepare stmt from @sql_text;  
  15. execute stmt;  
  16. end; 

  这么做,,,对性能肯定会有影响,也只是暂时的,,,

  附:

  

  MYSQL存储过程使用动态SQL 建多表

  

  例一:循环建立字段相同滴多表 表名如: k1k k2k k3k ........

  

  1. mysql> delimiter //  
  2. mysql> create procedure ppp (in i int)  
  3. -> begin  
  4. -> declare k int;  
  5. -> set k=1;  
  6. -> while k<i do  
  7. -> set @t=k;  
  8. -> set @tname=concat(k,@t,k);  
  9. -> set @dwhe=(id int,name varchar(255));  
  10. -> set @sql_text:=concat(create table ,@tname,@dwhe);  
  11. -> prepare stmt from @sql_text;  
  12. -> execute stmt;  
  13. -> set kk=k+1;  
  14. -> end while;  
  15. -> end;  
  16. -> //  
  17. Query OK, 0 rows affected (0.00 sec)  
  18. mysql> call ppp(6)//  
  19. Query OK, 0 rows affected (0.86 sec) 

  例二:参数做为表名 查询

  1. mysql> create procedure pp (tname varchar(255))  
  2. -> begin  
  3. -> set @na=tname;  
  4. -> set @sql_text:=select count(*) from ;  
  5. -> set @sql_text:=concat(@sql_text,@na);  
  6. -> prepare stmt from @sql_text;  
  7. -> execute stmt;  
  8. -> end; 

  上述的相关内容就是对Oracle MySQL动态表解决办法的描述,希望会给你带来一些帮助在此方面  。