oracle数据移植mysql_Oracle数据库移植到MySQL实战

本文详述了MySQL与Oracle在过程函数语法、数据类型转换、格式调整等方面的差异,涉及创建过程、赋值语句、游标处理、定时任务移植、用户管理及SQL语句移植等多个要点。提供了解决移植问题的实用技巧和注意事项。
摘要由CSDN通过智能技术生成

MySQL的过程和函数语法与Oracle类似,但还是有细微差别,除了数据类型需要转换,还有:

1.格式不同,例如:

Oracle为:

CREATE OR REPLACE procedure procedure1(TableName in varchar2) is

MySQL应该为:

CREATE procedure procedure1( in  TableName varchar(200))

2.赋值语句不同:

Oracle赋值语句为:

strSQL := ‘update table set field1=1’;

MySQL应该为:

Set StrSQL = ‘update table set field1=1’;(用:=也行)

3. 一些要用到游标的过程请注意

MySQL过程不支持嵌套游标,不支持带参游标,不支持记录类型%ROWTYPE,不支持数组等,原Oracle用到这些的必须改写

五、Job的移植

Job是Oracle的定时任务实现的方法,MySQL6中用Event实现,具体语法请参考MySQL手册。

在MySQL中使用event请注意,默认它是不运行的,您可以

1) 保证MySQL定时任务event scheduler运行,需要MySql 5.1.6以上,并且在启动后执行SET GLOBAL event_scheduler = ON;(也可以在初始配置文件比如my.ini中加入event_scheduler = ON的参数)

2) 启用event功能后,每次执行会往MySQL的错误日志文件写一些信息(data目录下的“主机名.err”文件),导致这个文件越来越大(除非经常做flush log操作)。所以,如果您的event执行很频繁,可在my.ini中加参数console=TRUE,这样执行event的信息就不会写进来了

六、用户的移植

Oracle的用户管理和MySQL下有较大区别,请分别建立用户,并赋予合适的权限。

七、应用程序的移植

由于语法细节上的差异,导致很多SQL语句需要改写。笔者记下了所有移植过程中碰到的SQL语句细节差异,这些也是一般项目可能会用到的地方,虽然肯定不全,但也列出来以供参考:

1)Oracle的to_char函数不能再使用,换用如CONCAT(14.3)的形式,为了提高应用程序兼容性,建议手工写一个

2)Oracle的to_date函数不能再使用,建议手工写一个添加到MySQL数据库

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要写成selectconcat('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

32/3<123>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值