一、从Oracle移植到MySQL主要有六个方面的内容需要移植,一是表Table,包括表结构和数据,二是触发器Trigger,三是存储过程Procedure,函数function和包Package,四是任务Job,五是用户等其他方面的移植,六是具体应用程序通过SQL语句访问时的细节差异克服。笔者用来移植测试的数据库是:Oracle 9i ,MySQL 6.0,Windows 2000环境。
二、经过映射转换,比如number会转换为double,date转换为timestamp等,请小心处理日期字段的默认值等,表的主键,表的索引(Oracle的位图索引会被转成BTree索引,另外表和字段的注释会丢失)等信息。需要特别注意的是,Oracle的自增字段的处理。提供字段自增属性。
三、触发器的移植首先,MySQL在6.0以后才支持触发器!触发器的移植没有现成工具,因为两者之间的语法差异较大,您只能通过手工对照着原来的逻辑一个一个添加。
四、存储过程,函数和程序包的移植程序包是Oracle用来组织逻辑功能的一个Object,MySQL不支持,因此需要将包里的存储过程﹑函数等全部放到该数据库公有过程和函数里面。
五、Job的移植Job是Oracle的定时任务实现的方法,MySQL6中用Event实现,具体语法请参考MySQL手册。
六、用户的移植Oracle的用户管理和MySQL下有较大区别,请分别建立用户,并赋予合适的权限。
七、应用程序的移植由于语法细节上的差异,导致很多SQL语句需要改写。笔者记下了所有移植过程中碰到的SQL语句细节差异,列出来以供参考:
1)Oracle的to_char函数不能再使用,换用如CONCAT(14.3)的形式,为了提高应用程序兼容性,建议手工写一个
2)Oracle的to_date函数不能再使用,建议手工写一个添加到MySQL数据库
eg:
to_char(sysdate,'yyyy-mm-dd')-->date_format(sysdate(),'%Y-%m-%d');
to_date(sysdate,'yyyy-mm-dd')-->STR_TO_DATE(sysdate(),'%Y-%m-%d');
to_char(add_months(to_date ('20000101','yyyymmdd'),1),'yyyy-mm-dd')-->date_add('2000-01-01',interval 1 month);
3)Oracle的decode函数不能再使用,换用SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END 的形式
4)nvl这样的一些专用函数,MySQL是没有的,可以把select nvl(to_char(num),'nothing') from t_equipment转换成select case num when num then num else 'nothing' end from t_equipment
5)instr之类的函数,函数名相同,但参数个数不同
6)Oracle的sysdate要写成sysdate()的形式
7)包的形式已经取消,所以原来以包的方式调用的过程如xx_pack.xxx要写成xxx()
8)带进制字符转数字Oracle风格:TO_NUMBER(strTmp,'XX') TO_NUMBER(’9’)MySQL风格:CONV(strTmp,16,10) CONV(’9’,10,10) 如果字符串前后有加减操作,会隐含转换成数字
9) 不能再有直接调用序列的形式,如果一定需要,可以模拟实现一个
10)日期直接加减的含义不同了,比如Oracle中sysdate + 1 变成了sysdate() + interval 1 day(注意如果写成sysdate() + 1 语法还是正确的,但含义是错误的)查询select sysdate() + 1 from dual 在MySQL得到比如 20080223153234(= 20080223153233 + 1)的数而在Oracle中会得到第二天当前时刻。
11) MySQL单纯的date类型只是日期不带时间,DATETIME或TIMESTAMP带有时间,用DATE_FORMAT函数可以控制显示形式
12)select 'abc' || 'd' from dual 两个数据执行的结果不同(语法都能通过),MySQL要写成select concat('abc' , 'd')的形式
13) Oracle高级功能,如带有暗示索引的select语句,MySQL是不支持的(语法可以通过)
14)有些MySQL的保留字不能直接用在SQL语句里,要加表名或别名限制,如select RIGHT FROM XX要改成select a.RIGHT FROM XX a
15) Oracle的子查询可以不起别名,但MySQL是必须的,比如下面的别名aa:select field1 from (select sysdate() as field1 from dual) as aa
16)很多系统表名都是不同的,比如,列出某个表的信息:select * from tab where TName='T_TEST'改成select table_name,table_type from information_schema.tables where table_schema = 'user' and table_name=' T_TEST '
17)MySQL下update时不能有本身的子查询update T_TEST set Flag = 0 where field1 in
(select distinct b.field1 from T_TEST b where b.flag=1)
18)Oracle下’’和null等价,而MySQL则不然select 1 from dual where '' is null在Oracle下可以取到记录,在MySQL下不能dual表的使用,substr、trim等函数的主要使用方式和Oracle类似
八、小结和建议看起来,Oracle移植到MySQL似乎挺麻烦,有没有一键完成的简单办法?呵呵,我没有找到,除非您只使用基本表,只使用基本SQL语句访问它。
举例:
CREATE TABLE sequence (
name VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 1,
PRIMARY KEY (name)
) ENGINE=InnoDB;
INSERT INTO sequence VALUES ('tmseq',1,1);
DELIMITER $
CREATE FUNCTION currval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BEGIN
DECLARE value INTEGER;
SET value = 0;
SELECT current_value INTO value FROM sequence WHERE name = seq_name;
RETURN value;
END$
DELIMITER ;
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BEGIN
UPDATE sequence SET current_value = current_value + increment WHERE name = seq_name;
RETURN currval(seq_name);
END$
DELIMITER ;
-- Create table
create table TASK_ID
(
ID bigint not null,
primary key (id)
);
(手动建存储过程注意用户和主机)
CREATE DEFINER = `root`@`localhost` PROCEDURE `get_tid`(IN `id_count` integer)
BEGIN
DECLARE i INT;
SET i=0;
WHILE i<id_count do
insert into task_id(select nextval('tmseq'));
set i=i+1;
end WHILE;
END;
三、事件:先打开
1、show variables like '%sche%';
2、set global event_scheduler =1;(需root用户)
注意手动创建比较好(起始时间)
CREATE EVENT `j_del_task`
ON SCHEDULE EVERY 1 DAY STARTS '2012-03-27 15:24:17'
ON COMPLETION PRESERVE
ENABLE
DO
delete from task;
分享到:
相关推荐
项目做好了,更高的要求被提出来,比如,要多数据库支持,怎么办?... 作为一个开源数据库,MySQL用无数案例证明了她的可用性,因此让我们把重点放在如何将Oracle移植到MySQL上。已经有很多的文章和专题介绍了Ora
Oracle到MySQL转换器是将数据库从Oracle迁移到MySQL服务器的工具。由于直接连接到源数据库和目标数据库,该程序保证了转换过程的高性能。它不使用ODBC或任何其他中间件组件。不需要安装Oracle组件。安装包包括产品到...
近些天在做一个同步功能,需要将mysql数据库中的某两张表的数据同步到oracle,考虑到表的字段较多,一个个写肯定不行,借助工具Convert Mysql to Oracle来转换!mysql中表与数据移植到oracle的纯绿色软件
mysql 数据移植到oracle
2.2.1 连接本机mysql数据库 2.2.2 连接生产oracle数据库 2.3 执行迁移 2.3.1 关联移植资料档案库 2.3.2 捕获方案 2.3.3 设置数据映射 2.3.4 转换为oracle模型 2.3.5 生成数据结构执行脚本 2.3.6 迁移数据结构 2.3.7 ...
此软件能很好将oracle数据移植到sql server上.是一款非常不错的移植软件 希望大家借鉴
一、sql-developer工具准备 二、工具使用说明 三、创建MySQL、Oracle数据库连接信息 四、Mysql数据库移植到Oracle数据库 五、通过PLsql登录
提供mysql移植到oracle的方案 实践过程描述
oracle_mysql系统移植方案归类.pdf
将数据从MySQL迁移到Oracle,大家需要注意什么?Oracle移植到mysql,又需要注意什么?如何有效解决移植过程的问题,为了数据库的兼容性我们又该注意些什么?感兴趣的小伙伴们可以参考一下
经过我公司的测试和验证,并成功运用于我公司现有项目的移植工作上:mysql5.5移植到oracle11g;发布出来避免各位同僚总是找不到有效、可行的移植方法,也不希望那些总是被别人转载了上百遍,甚至上千遍的无用文章再...
先有个免费工具,但每个表只能移植5条记录(clob blob等大数据类型都能处理)。若要代码自动批量移植,请MSN联系:dy-fairy@hotmail.com
oracle_mysql系统移植方案[参照].pdf
好用的工具可將MySQL DB完整移植到Oracle DB
您可以学会如何迁移数据库、移植SQL代码、使用Oracle和MySQL数据库以及配置高效率的查询。在这本内容广泛的书籍中,还包括了安全、监控和调试方面的技巧。 《Oracle Database 11g & MySQL 5.6开发手册》特色 理解...
您可以学会如何迁移数据库、移植SQL代码、使用Oracle和MySQL数据库以及配置高效率的查询。在这本内容广泛的书籍中,还包括了安全、监控和调试方面的技巧。 本书特色 ● 理解Oralce Database 11g和MySQL 5.6的架构 ...
最新版mysql驱动,连接mysql的必备jar文件,此处作为mysql中表与数据移植的工具之一
利用《Oracle Database 11g & MySQL5.6开发手册》,您将能够...您可以学会如何迁移数据库、移植SQL代码、使用Oracle和MySQL数据库以及配置高效率的查询。在这本内容广泛的书籍中,还包括了安全、监控和调试方面的技巧。
利用《Oracle Database 11g & MySQL5.6开发手册》,您将能够...您可以学会如何迁移数据库、移植SQL代码、使用Oracle和MySQL数据库以及配置高效率的查询。在这本内容广泛的书籍中,还包括了安全、监控和调试方面的技巧。
很多项目是基于Oracle数据库的,Oracle功能强大,但是部署和管理较复杂,更重要的是,购买Oracle的...因此,不少企业迫切需要把项目所用数据库移植到一个简单好用的数据库上。当然,如您所料,选择了广受欢迎的MySQL。