Oracle数据库迁移


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

一、使用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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值