一、从
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语句访问它 http://shshy39.垃圾广告.com/blog/342512
二、经过映射转换,比如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语句访问它 http://shshy39.垃圾广告.com/blog/342512
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14820194/viewspace-604359/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14820194/viewspace-604359/