下面的文章主要講述的是Oracle MySQL動態表的實際解決辦法,我們大家都知道,CRM需要定期將相關的數據導回到其CRM數據庫(目的DB:Oracle;源DB:MySQL);但是因為目前增長量不太大,,,而今後會比較大.由於Oracle MySQL數據庫不是我建的。
還是決定登上去看一下,主表沒有一個字段可以唯一標識一比記錄的,也就是說我目前只會面臨.我導數據的同時有新的數據錄入,明顯會出問題.程序員又不在,,,之前一直都只管Oracle,馬上要讓玩MySQL,看來只得現學現用了,現寫一個Oracle MySQL的存儲過程來實現.讓系統每天產生後一天的表放在那裡,系統根據時間的不同,將數據插入不同的表中,以下為實施腳本:
MySQL存儲過程事例:
- declare @t_date varchar(20);
- set @t_date = '(select concat('readinfo',curdate()+0))';
- MySQL>delimiter &&
臨時結束符
- MySQL>create procedure p()
- ->begin
- ->select * from pet;
- ->end;&&
- MySQL>delimiter ;
- MySQL> call p();
自寫Oracle MySQL存儲過程:
- CREATE TABLE readinfo20070726 (
- eid int(11) ,
- guid varchar(36) ,
- ip varchar(20) ,
- date varchar(20),
- bookname varchar(60) ,
- version int(11) ,
- isvip int(11) ,
- vipname varchar(80)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8
- CREATE TABLE readinfo20070727 (
- eid int(11) ,
- guid varchar(36) ,
- ip varchar(20) ,
- date varchar(20),
- bookname varchar(60) ,
- version int(11) ,
- isvip int(11) ,
- vipname varchar(80)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8
- CREATE TABLE readinfo20070728 (
- eid int(11) ,
- guid varchar(36) ,
- ip varchar(20) ,
- date varchar(20),
- bookname varchar(60) ,
- version int(11) ,
- isvip int(11) ,
- vipname varchar(80)
- ) ENGINE=MyISAM DEFAULT CHARSET=utf8
存儲過程:
- CREATE PROCEDURE sp_readinfo(in eid int,in guid varchar(36),in ip varchar(50))
- NOT DETERMINISTIC
- SQL SECURITY DEFINER
- COMMENT ''
- BEGIN
- set @table = concat('readinfo',curdate()+0);
- set @temp1 = 'insert into ';
- set @temp2 = '(eid,guid,ip,date) values(';
- set @value1 = eid;
- set @value2 = guid;
- set @value3 = ip;
- set @value4 = 'now())';
- set @sql_text:=concat(@temp1,@table,@temp2,@value1,',',@value2,',',@value3,',',@value4);
- prepare stmt from @sql_text;
- execute stmt;
- end;
這麼做,,,對性能肯定會有影響,也只是暫時的,,,
附:
MySQL存儲過程使用動態SQL 建多表
例一:循環建立字段相同滴多表 表名如: k1k k2k k3k ........
- MySQL> delimiter //
- MySQL> create procedure ppp (in i int)
- -> begin
- -> declare k int;
- -> set k=1;
- -> while k<i do
- -> set @t=k;
- -> set @tname=concat('k',@t,'k');
- -> set @dwhe='(id int,name varchar(255))';
- -> set @sql_text:=concat('create table ',@tname,@dwhe);
- -> prepare stmt from @sql_text;
- -> execute stmt;
- -> set kk=k+1;
- -> end while;
- -> end;
- -> //
- Query OK, 0 rows affected (0.00 sec)
- MySQL> call ppp(6)//
- Query OK, 0 rows affected (0.86 sec)
例二:參數做為表名 查詢
- MySQL> create procedure pp (tname varchar(255))
- -> begin
- -> set @na=tname;
- -> set @sql_text:='select count(*) from ';
- -> set @sql_text:=concat(@sql_text,@na);
- -> prepare stmt from @sql_text;
- -> execute stmt;
- -> end;