搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > N个程序猿的日常 > Mysql迁移到Oracle踩坑

Mysql迁移到Oracle踩坑

N个程序猿的日常 2020-05-23

公司要求兼容Oracle,将踩过的坑共享出来供大家参考。


1. limit转换

mysql:
selelct a,b,c from tableA where a=1 order by b limit 1,10;
oracle:
select * from (
select A.*, rowum r from (
select a,b,c from tableA where a=1 order by b
) A
where rownum <![CDATA[ <= ]]> 10
) B
where r > 1;


2. insert坑

mysql:
insert into tableA (id,name,type) value (1,2,3);
insert into tableA (id,name,type) values(1,2,3);
oracle:
insert into tableA (id,name,type) values (1,2,3);


3. group by

mysql:
select a,b,c from tableA where a = 1 group by b;
select count(1),b from tableA group by a;
oracle:

有group by时,select子句中要么只有聚合函数或为 “*”,要么必须包含group的子句(且要比其他子句出现的早);

select b,a,c from tableA where a =1 group by b;
select count(1),a,b from tableA group by a;

4. 日期

mysql:
select * from tableA where a > "2020-01-01 13:10:00";
select * from tableA where b = "2020-01-01 13:10:00";
oracle:
-- 12小时制的pattern写作'yyyy-MM-dd hh12:mi:ss',24小时制写作'yyyy-MM-dd hh24:mi:ss'
select * from tableA where a > to_date('2020-01-01 13:10:00','yyyy-MM-dd hh24:mi:ss');
-- 当b是varchar2类型时:
select * from tableA where b = '2020-01-01 13:10:00';
-- 当传来的参数是date类型,表中数据为varchar2类型时
select * from tableA where b = to_char('2020-01-01 13:10:00','yyyy-MM-dd hh24:mi:ss');


5. concat()函数

mysql:
select * from tableA where a like concat('%',#{a},'%');
oracle:
-- 注意:Oracle是单引号,Oracle的单双引号意义不同
select * from tableA where a like concat(concat('%',#{a}),'%');


6. 单引号双引号

mysql:
select * from tableA where a like concat("%",#{a},"%");
select * from tableA where a like concat('%',#{a},'%');
oracle:
-- 注意这里是单引号
select * from tableA where a like concat(concat('%',#{a}),'%');


7. 字段名为date

mysql:
select * from tableA where date = #{date};
oracle:
-- 这里是双引号
select * from tableA where "date" = #{date};


8. left()函数

mysql:
select left(a,4) from tableA;
oracle:
select substr(a,0,4) from tableA;


9. 解决id自增问题

-- 在表中创建sequence和对应的触发器,在向指定表插入数据时会自动填入id;

-- 避免重复,若没有创建过,可以不添加这句话
drop sequence tableA_id;

-- 创建sequence
create sequence tableA_id
       -- id的最小值
      minvalue 1  
       -- id的最大值,若没有或者不确定可以用 nomaxvalue
      maxvalue 9999999
       -- 递增量
      increment by 1    
       -- id的起始值
      start with 1
       -- 是否循环
      nocycle
       -- 是否设置缓存
      nocache;

-- 创建触发器
create or replace trigger tableA_id_trigger
-- 将触发器与tableA的insert事件绑定
before insert on tableA for each row
begin
-- tableA_id.nextval即为自动生成的id
select tableA_id.nextval into:new.id from dual;
end;
在 mapper.xml 中有填写id字段需求时也可以在有sequence的前提下写作:
<!-- tableA_id是数据库中已经创建的sequence -->
<insert id="insertTest" parameterType="java.util.Map" keyProperty="id">
      insert into tableA (id, col1, col2)
      values ( tableA_id.nextval, #{col1}, #{col2})
</insert>

10.仅针对插入、更新脚本:mysql的&和oracle的||符号

insert或者update语句中有字段包含”&“符号时,需要用||连接符或者:

mysql:
字符:"abc&def"

oracle:

字符:'abc'||'&'||'def'

11. 仅针对插入、更新脚本:mysql的转义字符 \ 和oracle的 '

mysql:
字符:{text:\'this is a test\',value:\'nothing\'}
oracle:
字符:{text:''this is a test'',value:''nothing''}

12. 字段大小写

oracle:
-- Oracle默认自动转大写,结果为tableA中的id、Id、iD、ID字段对应值;
select id  from tableA;
-- 可以理解成:单引号标识为字符id,结果为tableA中的id字段对应值;
select 'id' from tableA;
-- 同date等特殊字段,结果为tableA中的id、Id、iD、ID字段对应值;
select "id" from tableA;
-- 结果为tableA中的id、Id、iD、ID字段对应值;
select ID  from tableA;
-- 结果为tableA中的ID字段对应值;
select 'ID' from tableA;
-- 结果为tableA中的id、Id、iD、ID字段对应值;
select "ID" from tableA;



版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《Mysql迁移到Oracle踩坑》的版权归原作者「N个程序猿的日常」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注N个程序猿的日常微信公众号

N个程序猿的日常微信公众号:NICEDAYS_s

N个程序猿的日常

手机扫描上方二维码即可关注N个程序猿的日常微信公众号

N个程序猿的日常最新文章

精品公众号随机推荐