加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

oracle到mysql迁移对应关系1

(2018-09-27 20:57:06)
标签:

mysql

oracle迁移mysql

分类: mysql使用
如下是最近做一个oracle到mysql的迁移总结的部分迁移对照关系,记录下:

1. with as 公共表达式

Oracle允许在一个sql语句中通过with as 包含一个查询语句,将这个语句定义为一个临时表名,并在SQL语句中使用这个临时表名。

对应的mysql的实现方式为,将with as的功能表达式替换为一个子查询。

2. encode函数

oracle的encode函数根据参数的不同表达的意思也不一样。
如果是4个参数,例如encode(p1, p2, p3, p4) 需要替换为mysql的 if (p1 = p2, p3, p4),如果p2是NULL 需要写成 if(p1 is NULL, p3, p4);
如果多余4个参数,需要改写为case when,并且根据参数的个数添加或不添加else,例如
encode(p1, p2, p3, p4, p5),需要替换为case when p1=p2 then p3 when p1=p4 then p5 end;
encode(p1, p2, p3, p4, p5, p6), 需要替换为case when p1=p2 then p3 when p1=p4 then p5 else p6 end;
同样如果是NULL的话,需要改为 p1 is NULL。

3. nvl 函数

直接替换为ifnull

4. 子查询别名

oracle里如果 from 后面的子查询可能没有别名,例如select * from 子查询。
但在mysql里只要是子查询就必须有别名,所以需要补上别名。

5. to_char

如果to_char的是时间字段,to_char的第2个参数是一个时间格式字符串的话,可以调整为mysql的date_format,同时把时间格式字符串“yyyy-mm-dd hh24:mi:ss” 替换为“%Y-%m-%d %H:%i:%S”,“yyyy/mm/dd”替换为“%Y-%m-%d“。
如果to_char只跟一个参数,那么需要使用cast, 例如 to_char(c1),改写为 cast(c1 as char(64))。

6. to_number

to_number(c1) 改写为 cast(c1 as SIGNED   INTEGER)

7. to_date

替换为str_to_date

8. ||

Oracle里的||是字符串拼接,可以将其替换为mysql的concat 和ifnull。
c1||c2 改写为 concat(ifnull(c1,""), ifnull(c2,""))

9. sys_guid

需要替换为REPLACE(UUID(),'-','')

10. sysdate

oracle可以直接写sysdate函数名,而不用加()表示函数调用。
mysql必须加上(),所以调整为 sysdate()

11. rownum <= NUM 或 rownum < NUM

rownum <= NUM 替换为 limit num
rownum < NUM 替换为 limit num-1  (num-1需要计算出具体的数字,mysql的limit不支持表达式计算)

12. (+) for left 和right join

oracle里,允许使用(+)来表示left join或 right join。
例如
select .. from t1, t2 where t1.c1=t2.c2(+) 等价于mysql的 select .. from t1 left join t2 on t1.c1=t2.c2;
select .. from t1, t2 where t1.c1(+)=t2.c2 等价于mysql的 select .. from t1 right join t2 on t1.c1=t2.c2;

注意oracle中2张表可以出现多个(+),他们要同时出现在left join的on条件中,例如:
select .. from t1, t2 where t1.c1=t2.c2(+) and t1.c11=t2.c22(+) 等价于mysql的 select .. from t1 left join t2 on t1.c1=t2.c2 and t1.c11=t2.c22;

13. wmsys.wm_concat

替换为mysql的 group_concat

14. cast中的oracle类型

例如cast(c1 as varchar2(10)) 需要替换为 cast(c1 as char(10))

15. ADD_MONTHS

ADD_MONTHS(c1, 5) 替换为 ADDDATE(c1, INTERVAL 5 MONTH)

16. insert/delete 语句的表有别名

oracle允许在insert/delete语句中给被修改表加别名,例如 delete from t1 t where ...
在mysql中需要把别名去掉

17. rawtohex

替换为mysql的hex

18. 简单的connect by生成数据表

select level lv from dual connect by level <= 4
替换为
select 1 union select 2 union select 3 union select 4;


转载请注明转自高孝鑫的博客!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有