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…
相关文章推荐
- Oracle常用字段类型
- oracle数据库表,索引创建实例
- Oracle Indexes(索引)
- oracle connect by用法
- Oracle--sqlplus如何设置SQLPlus结果显示的宽度,ORACLE sqlplus提示符设置
- Oracle 常用Sql 语句
- ORACLE自定义顺序排序-转
- oracle中分组排序函数用法 - 转
- Oracle 回收表空间文件空闲的空间
- ORACLE 与Navicat
- oracle面试
- oracle 基础知识
- 关于oracle的sql命令操作
- ORACLE日常处理
- Oracle控制文件
- Oracle控制文件
- Oracle控制文件
- Oracle VM VirtualBox 搭建 Hadoop 环境的经验
- 关于plsql,一定要安装oracle客户端吗?
- xhost: unable to open display linux下安装oracle