知识大全 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程序迁移的注意事项

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 数据库数据迁移解决方案

  去年年底做了不少系统的数据迁移大部分系统由于平台和版本的原因做的是逻辑迁移少部分做的是物理迁移有一些心得体会与大家分享  首先说说迁移流程在迁移之前写好方案特别是实施的方案步骤一定要写清楚然后进行

知识大全 讲解Oracle到SQLServer主键迁移

讲解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数据文件位置迁移

Oracle数据文件位置迁移  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  操作系统Window