您的位置:首页 > 数据库 > Oracle

Oracle数据库迁移

2016-05-19 16:44 465 查看



以下是本人迁移过程中的一些记录:

一、使用Navicat工具将表和数据进行初步的迁移

使用工具:Navicate Premium,可同时连接Oracle和MySQL,选择数据传输,可实现数据库表和数据的传输。视图,函数和存储过程需要手动迁移。

使用Navicate Premium迁移时遇到问题:

Oracle Number字段类型会转成MySQL的decimal(65,30),手动将其改为对应长度的数字类型
Oracle中的varchar()长度太长会,在MySQL中会转成text类型,可根据情况改为varchar类型
Oracle中的DATE字段默认长度为7,而MySQL中的datetime类型的最大长度为6,导致工具无法迁移带有DATE字段类型的表,本人的解决方法是:获取到Oracle的建表语句,将其适当修改为满足MySQL语法的建表语句,在MySQL中建立相应的表,再通过工具传输数据

二、手动迁移存储过程,视图和函数:

Oracle和MySQL的很多语法不同,差异举例

•定义变量

•v_lower_limitinteger := 5000;

•DECLAREv_lower_limit INTEGER DEFAULT 5000;

•定义游标

•cursor cur_program is select * from tl_program where source =v_source;

•DECLARE cur_programCURSOR FOR SELECT * FROM tl_program WHERE source =v_source;

•获取系统时间

•v_start:= sysdate;

•SETv_start = SYSDATE();

•时间格式化

•to_char(sysdate,'yyyyMMddhh24miss')

•DATE_FORMAT(SYSDATE(), '%Y%m%d%H%i%s')

•字符串拼接

•'A' || 'B'

•CONCAT('A','B')

•条件转化

•decode(rate,2200,'高清',1300,'清晰') as quality

•(CASErate WHEN 2200 THEN '高清' WHEN 1300 THEN '清晰' END) AS quality

•字符串转数字类型

•to_number('2')

•cast('1'as  signed integer)

•调用存储过程

•P_TRANS_LOG(v_source);

•CALL P_TRANS_LOG (v_source) ;

在迁移的过程中需要根据MySQL的语法去实现Oracle实现的功能,在迁移过程中遇到几个问题记录如下:

分组排序:

oracle 实现:

SELECT… row_number() over (partition by …ORDER BY …DESC) as rnFROM…



MySQL实现

1、SQL语句中借助两个虚拟的字段实现分组和计数

SELECT tmp.*,IF (@type= tmp.deptid ,@rank :=@rank + 1 ,@rank := 1) AS rank, @type := tmp.deptid

  FROM ((SELECT *FROM employee e ORDER BY e.deptid DESC) tmp, (SELECT
@type:= NULL ,@rank := 0) a)

当type值与deptid值相同,则rank+1,否则从1开始重新统计。

2、在分组排序的基础上再取每组的前n条记录

SELECT empid,deptid,salary,rank FROM(SELECTtmp.*,IF (@type = tmp.deptid ,@rank :=@rank + 1 ,@rank := 1) AS rank, @type :=tmp.deptid

  FROM ((SELECT *FROM employee e ORDER BY e.deptid DESC) tmp, (SELECT @type := NULL ,@rank := 0)a)) cWHERE c.rank
<= n

树结构实现

oracle实现:

select ... start  with ….connectby prior…

mysql实现:

1、创建临时表

CREATE TEMPORARYTABLE IF NOT EXISTS tmpLst….

2、创建递归查询存储过程

CREATE DEFINER=`root`@`%` PROCEDURE`P_CREATE_CHILDLIST`(in rootId int, in nDepth int)

BEGIN

declare doneint default 0;

declare b int;

declare cur1 cursor for select node_id from tl_node_treewhere parent_id = rootId;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

SET @@max_sp_recursion_depth = 100; 

insert into tmpLst values (null, rootId, nDepth);

open cur1;

fetch cur1 into b;

while done = 0 do

  callP_CREATE_CHILDLIST(b, nDepth + 1);

  fetch cur1 intob;

end while;

close cur1;

END

3、从临时表中复制数据

INSERT INTO …SELECT …FROM tmpLst…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: