加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码门户网 (https://www.92codes.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

从Oracle迁移到MySQL的各种坑及自救方案

发布时间:2021-01-11 08:19:30 所属栏目:安全 来源:网络整理
导读:副标题#e# 《从Oracle迁移到MySQL的各种坑及自救方案》要点: 本文介绍了从Oracle迁移到MySQL的各种坑及自救方案,希望对您有用。如果有疑问,可以联系我们。 本文根据冯帅老师在〖4月8日DBAplus社群上海数据库技术沙龙〗现场演讲内容整理而成. 讲师介绍 冯

上面用了很长的篇幅介绍了一下几种迁移的工具,每种迁移的方式都是各有千秋,在合适的场景下选择适合自己的方法进行操作.不过刚刚迁移的都是表和数据对象.我们都知道在数据库还有一些其它的对象,像视图、物化视图、存储过程、函数、包,或者一个索引,同样的SQL是不是也需要改写,都是我们需要考虑到的一个因素.

接下来我们来看一下其它对象怎么迁移.

1、view

在MySQL里view是不可以嵌套子查询的:

create view v_test as select * from (select * from test) t;

ERROR 1349 (HY000): View’s SELECT contains a subquery in the FROM clause

解决方法就是view的嵌套:

create view v_sub_test as select * from test;

Query OK,0 rows affected (0.02 sec)

create view v_test as select * from v_sub_test;

Query OK,0 rows affected (0.00 sec)

2、物化视图

物化视图用于预先计算并保存表连接或聚集等耗时较多的操作结果,这样在执行查询时,就可以避免进行这些耗时的操作,而从快速得到结果.但是MySQL里没有这个功能.通过事件调度和存储过程模拟物化视图,实现的难点在于更新物化视图,如果要求实时性高的更新,并且表太大的话,可能会有一些性能问题.

3、Trigger、存储过程、package

1)Oracle创建触发器时允许or,但是MySQL不允许.所以迁移时如果有需要写两个.

2)两种数据库定义变量的位置不同,而且MySQL里不支持%type.这个在Oracle中用得太频繁了,是个好习惯.

3)elseif的逻辑分支语法不同,并且MySQL里也没有for循环.

4)在MySQL中不可以返回cursor,并且声明时就要赋对象.

5)Oracle用包来把存储过程分门别类,而且在package里可以定义公共的变量/类型,既方便了编程,又减少了服务器的编译开销.可MySQL里根本没有这个概念.所以MySQL的函数也不可以重载.

6)预定义函数.MySQL里没有to_char() to_date()之类的函数,也并不是所有的Oracle都是好的,就像substring()和load_file()这样的函数,MySQL有,Oracle却没有.

7)MySQL里可以使用set和=号给变量赋值,但不可以使用:=. 而且在MySQL里没 || 来拼接字符串.

8)MySQL的注释必须要求– 和内容之间有一个空格.

9)MySQL存储过程中只能使用leave退出当前存储过程,不可以使用return.

10)MySQL异常对象不同,MySQL同样的可以定义和处理异常,但对象名字不一样.

(编辑:源码门户网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读