Javamysql语法转化oracle_数据库移植之oracle To mysql(java)

本文介绍了将Oracle数据库移植到MySQL的过程,涉及Java实体移植、DDL转换、自增主键处理、数据类型映射、系统函数变化、HQL使用注意事项、触发器与存储过程的区别以及语法限制等关键点。
摘要由CSDN通过智能技术生成

一年没写博客了,准备记录一下。

1.java 实体的移植

主键生成策略有JPA 提供与Hibernate 提供之分

JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.

TABLE:使用一个特定的数据库表格来保存主键。

SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。

IDENTITY:主键由数据库自动生成(主要是自动增长型)

AUTO:主键由程序控制。

这里如果是mysql数据库一般使用Identity,Oracle 使用Sequence。 当使用Auto时,如果使用Oracle且配置了Sequence则使用Sequence,Mysql则使用Identity 。主键生成策略应该配置为Auto 并配置Squeuence,Oracle转mysql 则不会有问题。

2.DDL的问题

Orcale 里可以写 create or replace table  Table_name

Mysql  需要变换为  Drop Table Table_name if exists table_name

create table table_name

3.Mysql需要对自增主键添加 auto_increment

Oracle中一般会先建立表然后通过 alter table 设置表的 主键,这时需要注意,我们需要将主键定义在create table语句中进行。

4.Mysql引擎的选择

Mysql5.*默认为Innodb,支持事物以及行锁表锁,所以应选择Innodb  ,但是对于使用空间数据的情况需要使用MyISAM,因为Innodb不支持空间数据

5.数据类型的转换

下表是数据类型映射的表

MySQL Data Type

Oracle Data Type

BIGINT

NUMBER(19, 0)

BIT

RAW

BLOB

BLOB, RAW

CHAR

CHAR

DATE

DATE

DATETIME

DATE

DECIMAL

FLOAT (24)

DOUBLE

FLOAT (24)

DOUBLE PRECISION

FLOAT (24)

ENUM

VARCHAR2

FLOAT

FLOAT

INT

NUMBER(10, 0)

INTEGER

NUMBER(10, 0)

LONGBLOB

BLOB, RAW

LONGTEXT

CLOB, RAW

MEDIUMBLOB

BLOB, RAW

MEDIUMINT

NUMBER(7, 0)

MEDIUMTEXT

CLOB, RAW

NUMERIC

NUMBER

REAL

FLOAT (24)

SET

VARCHAR2

SMALLINT

NUMBER(5, 0)

TEXT

VARCHAR2, CLOB

TIME

DATE

TIMESTAMP

DATE

TINYBLOB

RAW

TINYINT

NUMBER(3, 0)

TINYTEXT

VARCHAR2

VARCHAR

VARCHAR2, CLOB

YEAR

NUMBER

主要关注date,number,varchar2 的转换。其中需要注意 varchar2 的转换,因为在oracle 中varchar2表示存储的字节数,与编码有关,而mysql中varchar则没有,mysql中varchar(30)表示存储30个字符,所以此处需要注意。至于date 因为不需要支持微妙,所以我使用timestamp储存了。

6.常用的系统函数变化

to_date --> char_to_date     to_char-->date_to_char     ||-->concat

7. hql 中需要注意,避免使用原始sql尽量使用hql,尤其是日期处理。对于空串的处理,在oracle中 varchar2下传入空串则oracle作为 null处理,所以你搜索空串是无结果的

但是mysql中是有空串的. mysql中需要为子查询设置别名要么也会报错。分页查询,mysql中没有rownum,可以使用limit实现,建议使用hql。

8.注意切换hibernate方言

9.触发器与存储过程

oracle的触发器比较高端,对于行触发器支持到按照某列改变触发,而mysql只支持行触发。 oracle中可以判断当前操作类型update,delete 还是 insert,mysql只能分开写    了。变量声明的语法也不相同,需要注意(会详细写一篇)

10。获取当前使用的数据库

我的方法比较屌丝根据Hibernate方言判断使用哪种

11.一些语法上的限制

1).  Every derived table must have its own alias

遇到这个问题驱动表需要有一个别名,比如 select sum(money) sum from (select * from guest limit 0,10) t;

2)delete from decode_resource re  where re.decode_resource_id=1

这个地方原因未知,delete 中不可以表的别名?去掉re即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值