oracle移植mysql方案_系统从MySQL迁移至ORACLE实现方案

一、数据库脚本迁移

1、数据结构同步

打开Navicat Premium,点击菜单【工具】-【数据传输】,在弹出的对话框中选择对应的源库和目标库。

e1b8fc57075d339b156fdefae1c96d23.png

为使用方便,请在TAB页【高级】中,将【转换对象名为】勾选,并选择【大写】。设置完成后点击【开始】按钮即可进行数据脚本同步。

注意:数据传输过程中,可能会因为MySQL数据库设计的不规范导致出现异常,请及时修正源库对应的数据结构。Oracle中标识符的最大长度是30个字符,标识符包括但不限于表名、字段名、视图名、序列名、主键。

2、表结构调整

Navicat Premium数据同步时,不对列长度进行精确设置(保留默认长度),故需要在数据结构同步完成以后再将Oracle数据库脚本导出并对列的长度进行精确的设置。

注意:Oracle数据库表中有数据时不能直接修改表结构,所以建议导出数据库脚本,在脚本中进行修改。另外,Navicat Premium导出的SQL包含前缀和双引号,请在导出后去除。

3、添加sequence

Oracle表的主键自增是通过sequence实现的,故需要为表自增主键添加sequence,sequence创建示例如下:

CREATE SEQUENCE SEQ_ACCOUNT_INFO INCREMENT BY 1 START WITH 1 minvalue 1 NOMAXVALUE NOCACHE;

二、系统配置调整

1、pom文件中添加Oracle数据库驱动

com.oracle

ojdbc14

10.2.0.4.0

system

${project_basedir}/lib/ojdbc14-10.2.0.4.0.jar

2、调整数据源

jdbc.properties配置调整

db.driverClassName=oracle.jdbc.driver.OracleDriver

db.url=jdbc:oracle:thin:@10.10.1.107:1521:orcl

db.username=root

db.password=root

db.mapper=classpath:mybatis/oracle/*Mapper.xml

validationQuery=SELECT 'x' FROM DUAL

三、Java后台调整

1、 Mapper文件中,自增主键调整为Oracle的sequence方式

原MySQL的方式如下:

SELECT LAST_INSERT_ID()

Oracle的sequence方式如下:

SELECT SEQ_ACCOUNT_INFO.NEXTVAL FROM DUAL

2、日期(时间)类型调整

日期格式化

MySQL数据库通过DATE_FORMAT(date,format)函数将日期格式化为字符串,其中format可用的标识符有:%Y(年)、%m(月)、%H(小时)、%i(分钟)、%S(秒)等等,常用的格式有'%Y-%m-%d'、'%H:%i:%S'、'%Y%m'等。

Oracle数据库使用TO_CHAR(date,format)函数对日期进行格式化,如对当前日期进行格式化:TO_CHAR(SYSDATE,'yyyy-mm-dd HH:mi:ss')。

另外,MySQL是弱类型的数据类型,在字符串转日期(其他类型也一样)时只要符合日期格式不需要进行类型转换,但是Oracle必须进行类型转换。Oracle提供了TO_DATE(date_str,'yyyy-mm-dd hh24:mi:ss')函数将字符串转换为日期类型。

取当前日期的函数

MySQL常用取当前日期(时间)的函数有:NOW()、SYSDATE()、CURDATE()、CURTIME()等。Oracle中使用SYSDATE。

计算时间差

MySQL数据库使用TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)函数来计算时差,其中interval可以是YEAR(年)、QUARTER(季度)、MONTH(月)、WEEK(星期)、DAY(天)、HOUR(小时)、MINUTE(分钟)、SECOND(秒) 、FRAC_SECOND(毫秒),如计算2017年五一劳动节距今的天数:

SELECT TIMESTAMPDIFF(day,'2017-05-01',now());

MySQL还有很多计算时间差的函数,如DATEDIFF(date1,date2)等。

Oracle数据库直接通过两日期相减来实现时间差的计算,如计算2017年五一劳动节距今的天数:

SELECT FLOOR(SYSDATE-TO_DATE('2017-5-1','yyyy-mm-dd')) FROM DUAL ;

计算2017年五一距今的小时数:

SELECT FLOOR(TO_NUMBER(SYSDATE-TO_DATE('2017-5-1 00:00:00','yyyy-mm-dd hh24:mi:ss'))*24) FROM DUAL ;

3、模糊查询

MySQL使用

concat('%',#{keywords},'%')

Oracle中使用

'%'||#{keywords}||'%'

四、 常见问题

1、去除重复列,防止在oracle分页查询时报错:ORA-00918: 未明确定义列。

2、出现ORA-00942: 表或视图不存在错误,可能是数据库表名错误,也可能是没有权限或者账号不存在等等。

3、MySQL 字符串支持单引号和双引号,但Oracle只支持单引号。

4、Oracle里进行分组统计时,非聚合列必须全部放在group by 子句中。如果还涉及到排序,排序的列也必须在group by 子句中。MySQL 5.7之前对分组统计没有强制约束,5.7之后 和oracle遵循相同的标准。

5、不能在Oracle的GROUP BY子句中使用列别名。

6、Oracle 中别名不能加单引号。

7、MySQL 的批量插入、更新转换为 Oracle 的批量插入、更新时需加上begin end

BEGIN

statement

; END ;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值