下面的文章主要讲述的是Oracle MySQL动态表的实际解决办法,我们大家都知道,CRM需要定期将相关的数据导回到其CRM数据库(目的DB:Oracle;源DB:MySQL);但是因为目前增长量不太大,,,而今后会比较大.由于Oracle MySQL数据库不是我建的。
还是决定登上去看一下,主表没有一个字段可以***标识一比记录的,也就是说我目前只会面临.我导数据的同时有新的数据录入,明显会出问题.程序员又不在,,,之前一直都只管Oracle,马上要让玩MySQL,看来只得现学现用了,现写一个Oracle MySQL的存储过程来实现.让系统每天产生后一天的表放在那里,系统根据时间的不同,将数据插入不同的表中,以下为实施脚本:
MySQL存储过程事例:
declare@t_datevarchar(20); set@t_date='(selectconcat('readinfo',curdate()+0))'; mysql>delimiter&&
临时结束符
mysql>createprocedurep() ->begin ->select*frompet; ->end;&& mysql>delimiter; mysql>callp();
自写Oracle MySQL存储过程:
CREATETABLEreadinfo20070726( eidint(11), guidvarchar(36), ipvarchar(20), datevarchar(20), booknamevarchar(60), versionint(11), isvipint(11), vipnamevarchar(80) )ENGINE=MyISAMDEFAULTCHARSET=utf8 CREATETABLEreadinfo20070727( eidint(11), guidvarchar(36), ipvarchar(20), datevarchar(20), booknamevarchar(60), versionint(11), isvipint(11), vipnamevarchar(80) )ENGINE=MyISAMDEFAULTCHARSET=utf8 CREATETABLEreadinfo20070728( eidint(11), guidvarchar(36), ipvarchar(20), datevarchar(20), booknamevarchar(60), versionint(11), isvipint(11), vipnamevarchar(80) )ENGINE=MyISAMDEFAULTCHARSET=utf8
存储过程:
CREATEPROCEDUREsp_readinfo(ineidint,inguidvarchar(36),inipvarchar(50)) NOTDETERMINISTIC SQLSECURITYDEFINER COMMENT'' BEGIN set@table=concat('readinfo',curdate()+0); set@temp1='insertinto'; 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); preparestmtfrom@sql_text; executestmt; end;
这么做,,,对性能肯定会有影响,也只是暂时的,,,
附:
MYSQL存储过程使用动态SQL 建多表
例一:循环建立字段相同滴多表 表名如: k1k k2k k3k ……..
mysql>delimiter// mysql>createprocedureppp(iniint) ->begin ->declarekint; ->setk=1; ->whilek<ido ->set@t=k; ->set@tname=concat('k',@t,'k'); ->set@dwhe='(idint,namevarchar(255))'; ->set@sql_text:=concat('createtable',@tname,@dwhe); ->preparestmtfrom@sql_text; ->executestmt; ->setkk=k+1; ->endwhile; ->end; ->// QueryOK,0rowsaffected(0.00sec) mysql>callppp(6)// QueryOK,0rowsaffected(0.86sec)
例二:参数做为表名 查询
mysql>createprocedurepp(tnamevarchar(255)) ->begin ->set@na=tname; ->set@sql_text:='selectcount(*)from'; ->set@sql_text:=concat(@sql_text,@na); ->preparestmtfrom@sql_text; ->executestmt; ->end;
相关文章
标签:Oracle