主页 > 知识库 > 数据库 > Oracle >

oracle到mysql的迁移步骤及各种注意事项

来源:中国IT实验室 作者:佚名 发表于:2013-05-15 14:46  点击:
最近公司一个项目需要将数据库进行一次迁移,从oracle到mysql,网上资料甚少,现将我本次迁移过程中所遇到的一些问题总结于此(主要是存储过程的迁移),希望能给自己做一个日后的参考,如果有幸能帮助到大家更好。 -- mysql中没有包的概念,因此迁移的时候将
最近公司一个项目需要将数据库进行一次迁移,从oracle到mysql,网上资料甚少,现将我本次迁移过程中所遇到的一些问题总结于此(主要是存储过程的迁移),希望能给自己做一个日后的参考,如果有幸能帮助到大家更好。    -- mysql中没有包的概念,因此迁移的时候将存储过程命名为'包名。存储过程名'的格式
    mysql存储过程格式:
    DELIMITER $$   -- 分隔符
    -- CREATE PROCEDURE([[IN |OUT ] 参数名 数据类型…]) ,IN和OUT写在最前面,其中IN可以省略
    CREATE PROCEDURE `pkg_ypgl.prc_ypsc`(
    prm_ypbm VARCHAR (20),
    OUT prm_AppCode VARCHAR (20),
    -- 程序执行代码
    OUT prm_ErrorMsg VARCHAR (100)
    -- 程序执行错误信息
    )
    BEGIN
    /*变量定义*/
    DECLARE n_count DECIMAL (8) ;
    DECLARE done INT(10);
    /*设置游标结束标志*/
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;  -- 如果NOT FOUND,取不到值,则将done赋值1,并且程序继续执行
    SET done=0;
    /*定义一个区块lavel_error,逻辑错误处理*/
    label_error :  BEGIN
    /*定义游标*/
    DECLARE cur_bdjl CURSOR FOR
    SELECT ……
    /*打开游标*/
    OPEN cur_bdjl ;
    REPEAT
    FETCH cur_bdjl INTO v_aaz001…
    IF NOT done THEN -- 如果结束标志done为0则继续循环
    ……
    END IF;
    /*结束循环,关闭游标*/
    UNTIL done -- 直到NOT FOUND
    END REPEAT ;
    CLOSE cur_bdjl ;
    SET prm_AppCode = 'noerror' ;  -- 将prm_AppCode设为正确
    SET prm_ErrorMsg = '' ;
    END;
    END$$
    DELIMITER ;
    数据类型:
    Oracle:varchar2    Mysql:varchar(20)  (参数自设)
    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 代表所有以01开头的错误代码
    NOT FOUND 代表所有以02开头的错误代码,也包括游标结束的时候
    SQLEXCEPTION 代表除了SQLWARNING和NOT FOUND 的所有错误代码
    eg. DECLARE EXIT HANDLER FORSQLEXCEPTION,SQLWARNING,NOT FOUND SET a = 1;
    注:一个begin…end里面只能声明一个HANDLER,EXIT表示遇到这种异常时就执行SET a = 1然后结束这个存储过程,CONTINUE表示遇到这种异常时就SET a = 1,然后继续执行之后的存储过程
    跳转:
    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 ……

有帮助
(0)
0%
没帮助
(0)
0%