从Oracle迁移到MySQL的各种坑及自救方案
上面用了很长的篇幅介绍了一下几种迁移的工具,每种迁移的方式都是各有千秋,在合适的场景下选择适合自己的方法进行操作.不过刚刚迁移的都是表和数据对象.我们都知道在数据库还有一些其它的对象,像视图、物化视图、存储过程、函数、包,或者一个索引,同样的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、存储过程、package1)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同样的可以定义和处理异常,但对象名字不一样. (编辑:源码门户网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |