知识大全 oracle到mysql的迁移步骤及各种注意事项
Posted 知
篇首语:初心不与年俱老,奋斗永似少年时。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 oracle到mysql的迁移步骤及各种注意事项相关的知识,希望对你有一定的参考价值。
最近公司一个项目需要将数据库进行一次迁移 从oracle到mysql 网上资料甚少 现将我本次迁移过程中所遇到的一些问题总结于此(主要是存储过程的迁移) 希望能给自己做一个日后的参考 如果有幸能帮助到大家更好
mysql中没有包的概念 因此迁移的时候将存储过程命名为 包名 存储过程名 的格式
mysql存储过程格式
DELIMITER $$ 分隔符
CREATE PROCEDURE([[IN |OUT ] 参数名 数据类型…]) IN和OUT写在最前面 其中IN可以省略
CREATE PROCEDURE `pkg_ypgl prc_ypsc`(
prm_ypbm VARCHAR ( )
OUT prm_AppCode VARCHAR ( )
程序执行代码
OUT prm_ErrorMsg VARCHAR ( )
程序执行错误信息
)
BEGIN
/*变量定义*/
DECLARE n_count DECIMAL ( ) ;
DECLARE done INT( )
/*设置游标结束标志*/
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done= ; 如果NOT FOUND 取不到值 则将done赋值 并且程序继续执行
SET done= ;
/*定义一个区块lavel_error 逻辑错误处理*/
label_error : BEGIN
/*定义游标*/
DECLARE cur_bdjl CURSOR FOR
SELECT ……
/*打开游标*/
OPEN cur_bdjl ;
REPEAT
FETCH cur_bdjl INTO v_aaz …
IF NOT done THEN 如果结束标志done为 则继续循环
……
END IF;
/*结束循环 关闭游标*/
UNTIL done 直到NOT FOUND
END REPEAT ;
CLOSE cur_bdjl ;
SET prm_AppCode = noerror ; 将prm_AppCode设为正确
SET prm_ErrorMsg = ;
END;
END$$
DELIMITER ;
数据类型
Oracle:varchar Mysql:varchar( ) (参数自设)
Oracle:number() Mysql:decimal()
Oracle:date Mysql:datetime
定义变量
Mysql需要在每句前面加DECLARE
给变量赋值
Oracle:v_string := asdas ; Mysql: SET string := asdas ; (等号前面的冒号可以有也可以没有)
异常处理
Oracle:EXCEPTION WHEN OTHERS THEN…
Mysql: DECLARE EXIT | CONTINUE HANDLERFOR error number | SQLSTATE error string | condition SQL statement;
SQLWARNING 代表所有以 开头的错误代码
NOT FOUND 代表所有以 开头的错误代码 也包括游标结束的时候
SQLEXCEPTION 代表除了SQLWARNING和NOT FOUND 的所有错误代码
eg DECLARE EXIT HANDLER FORSQLEXCEPTION SQLWARNING NOT FOUND SET a = ;
注 一个begin…end里面只能声明一个HANDLER EXIT表示遇到这种异常时就执行SET a = 然后结束这个存储过程 CONTINUE表示遇到这种异常时就SET a = 然后继续执行之后的存储过程
跳转
Oracle: GOTO label_error;
……
《label_error 》
Mysql:初始化错误代码prm_AppCode为 错误 定义一个区块label_error 在区块的最后将prm_AppCode set为 noerror 中间触发条件 将GOTO label_error;改写成leave label_error;跳出区块
游标
Mysql只有静态游标 没有动态游标 用存储过程代替
定义游标的语句为DECLAREcur_bdjl CURSOR FOR ……
Mysql不支持rec_curname aaz 这种写法 所以必须将游标取得的所有字段FETCH INTO 到变量里循环
Mysql里有三种循环方式
( ) WHILE循环
WHILE expression DO
statements
END WHILE;
( ) LOOP循环
LOOP
statements
END LOOP;
( ) REPEAT UNTIL循环
REPEAT
statements
UNTIL expression
END REPEAT;
序列
Mysql中没有序列 用函数+表的方法取代
建表语句
CREATE TABLE `seq` (
`name` varchar( ) NOT NULL DEFAULT MENT 序列号生成器名称
`val` bigint( ) unsigned NOT NULL MENT 序列号
`increment` int( ) DEFAULT MENT 序列的增量
`min` bigint( ) DEFAULT NULL MENT 序列最小值
`max` bigint( ) DEFAULT NULL MENT 序列最大值
`cycle` char( ) DEFAULT N MENT 是否循环
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf MENT= mysql模拟序列号生成器用表
函数如下(自己写的 可能有错)
DELIMITER $$
DROP FUNCTION IF EXISTS `seq`$$
CREATE FUNCTION `seq`(seq_name VARCHAR( ))RETURNS BIGINT( )
BEGIN
DECLARE v_value BIGINT( )
DECLARE v_CYCLE CHAR;
DECLARE v_MIN BIGINT( )
DECLARE v_MAX BIGINT( )
SELECT a val a MIN a MAX a CYCLE INTOv_value v_MIN v_MAX v_CYCLE FROM seq a WHERE NAME = seq_name;
IFv_CYCLE = Y AND v_value = v_MAX THEN 该序列为循环且当前值为其最大值
UPDATE seq 将当前值设为 v_MIN
SET val = v_MIN
WHERE NAME = seq_name;
ELSE
UPDATE seq 否则将当前值设为val + increment
SET val = val + increment
WHERE NAME = seq_name;
END IF;
SELECT val INTO v_value FROM seqWHERE NAME = seq_name;
RETURN v_value;
END$$
DELIMITER ;
更新
Oracle: UPDATE TABLE T SET (A B C) = (SELECT A B C FROM TABLE_ K WHERE K Y =T Y) WHERE T X = V_X;
Mysql: UPDATE TABLE T TABLE_ K SET T A =K A T B=K B T C=K C WHERE K Y = T Y ANDT X = V_X
GROUP BY:
mysql的group by 语句可以select 没有被分组的字段 如
select id name age from A group by age
这个取出的id name所在的行是每个分组中的第一行数据
调用
Mysql: call procedure_name(所有参数)
跳出循环
Oracle: EXIT;
Mysql: 将循环的内容定义为一个区块label_loop 需要跳出循环时则 leave label_loop;
注释
#注释内容
注释内容 注意 后需要加一个空格
块注释用/*注释内容*/
表的注释
在oracle中执行如下语句
select altertable ||table_name|| ment || ||MENTS|| || ; fromUSER_TAB_MENTS where ments is not null;
将得到的结果放到mysql中执行即可添加表名的注释
表的字段注释
在oracle中执行如下语句
select distinct(data_type) FROM all_tab_columns where owner= YDMIS
将查询出的本次转换涉及到的数据类型用decode函数转换为Mysql中对应函数(参数)的形式 如将CHAR转换为CHAR( ) 参数的值在all_tab_columns的DATA_LENGTH DATA_PRECISION DATA_SCALE中取得
在oracle中执行如下语句 注意decode函数里的参数需根据上一步的查询结果转换
select altertable ||a table_name|| modify column ||lumn_name|| ||decode(b data_type VARCHAR VARCHAR( ||b DATA_LENGTH|| ) DATE DATETIME NUMBER DECIMAL( ||b DATA_PRECISION|| ||b DATA_SCALE|| ) CHAR CHAR( ||b DATA_LENGTH|| ) LONGRAW mediumblob )|| ment || ||ments|| || ;
from user_col_ments a all_tab_columnsb
where ments is not null
and a table_name = b table_name
and lumn_name = lumn_name
and b owner = YDMIS ;
将得到的结果放到mysql中执行即可添加表字段的注释
函数
功能 oracle mysql 备注 eg oracle eg mysql
连接字符串 || concat() a || b || c concat( a b c )
将其他格式转换为字符串 concat(x )
截取字符串 substr() substring() substr( abcd ) substring( abcd )
string转换为date to_date() str_to_date(str format) to_date(aae yyyy mm dd hh :mi:ss ) str_to_date(aae %Y %m %d %H:%i:%s )
获取当前日期 sysdate now() sysdate() current_date now()返回的是程序开始执行时的时间 sysdate()返回实时时间
一般用now()
current_date表示当前的年月日
取出日期的指定部分 date_format(date type) %Y:年
%c:月
%d:日
%H:小时
%i:分钟
%s:秒 date_format(now() %Y %c %d %h:%i:%s )
增加一天 sysdate+ DATE_ADD(date INTERVAL expr type) sysdate+ DATE_ADD(now() INTERVAL DAY)
类型转换 TO_CHAR
TO_DATE
TO_NUMBER cast(xxx as type) type:二进制 : BINARY
字符型 可带参数 : CHAR()
日期 : DATE
时间 TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED to_char( ) cast( as char( ))
精度转换 to_number(x type) round(x d) 保留到小数点后d位 而第d位的保留方式为四舍五入 若要保留x值小数点左边的d位 可将d设为负值
替换空值 NVL( string replace_with) ifnull(string replace_with)
cha138/Article/program/Oracle/201311/17055相关参考
MYSQL到ORACLE程序迁移的注意事项 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 有很多
知识大全 PHP将数据从Oracle向Mysql数据迁移实例
PHP将数据从Oracle向Mysql数据迁移实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
知识大全 MS SQL7.0的数据迁移到MySQL上的一种方法
MSSQL7.0的数据迁移到MySQL上的一种方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
去年年底做了不少系统的数据迁移大部分系统由于平台和版本的原因做的是逻辑迁移少部分做的是物理迁移有一些心得体会与大家分享 首先说说迁移流程在迁移之前写好方案特别是实施的方案步骤一定要写清楚然后进行
讲解Oracle到SQLServer主键迁移 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这篇
知识大全 .NET框架下从Oracle到SQL Server的迁移
.NET框架下从Oracle到SQLServer的迁移 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧
知识大全 Oracle Optimizer:迁移到使用基于成本的优化器-----系列1.4
OracleOptimizer:迁移到使用基于成本的优化器-----系列1.4 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,
知识大全 rhel4+oracle10g ASM配制及ASM与文件系统之间迁移
rhel4+oracle10gASM配制及ASM与文件系统之间迁移 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一
知识大全 oracle 9206升级到10.2.0.2简要步骤
cha138/Article/program/Oracle/201311/19018
Oracle数据文件位置迁移 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 操作系统Window