下面的文章主要讲述的是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 &&
- 1.
- 2.
- 3.
临时结束符
mysql>create procedure p()
->begin
->select * from pet;
->end;&&
mysql>delimiter ;
mysql> call p();
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
自写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
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
存储过程:
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;
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
这么做,,,对性能肯定会有影响,也只是暂时的,,,
附:
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)
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
例二:参数做为表名 查询
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;
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
上述的相关内容就是对Oracle MySQL动态表解决办法的描述,希望会给你带来一些帮助在此方面。
【编辑推荐】