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

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

来源:中国IT实验室 作者:佚名 发表于:2013-05-15 14:46  点击:
Mysql不支持rec_curname.aaz001这种写法,所以必须将游标取得的所有字段FETCH INTO 到变量里循环: Mysql里有三种循环方式 (1)。WHILE循环 WHILE expression DO statements END WHILE; (2)。LOOP循环 LOOP stat

Mysql不支持rec_curname.aaz001这种写法,所以必须将游标取得的所有字段FETCH INTO 到变量里循环:    Mysql里有三种循环方式
    (1)。WHILE循环
    WHILE  expression DO
    statements
    END   WHILE;
    (2)。LOOP循环
    LOOP
    statements
    END  LOOP;
    (3)。REPEAT UNTIL循环
    REPEAT
    statements
    UNTIL expression
    END  REPEAT;
    序列:
    Mysql中没有序列,用函数+表的方法取代。
    建表语句:
    CREATE TABLE `seq` (
    `name` varchar(20) NOT NULL DEFAULT '' COMMENT '序列号生成器名称',
    `val` bigint(20) unsigned NOT NULL COMMENT '序列号',
    `increment` int(4) DEFAULT '1' COMMENT '序列的增量',
    `min` bigint(20) DEFAULT NULL COMMENT '序列最小值',
    `max` bigint(20) DEFAULT NULL COMMENT '序列最大值',
    `cycle` char(1) DEFAULT 'N' COMMENT '是否循环',
    PRIMARY KEY (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='mysql模拟序列号生成器用表'
    函数如下(自己写的,可能有错):
    DELIMITER $$
    DROP FUNCTION IF EXISTS `seq`$$
    CREATE FUNCTION `seq`(seq_name VARCHAR(20))RETURNS BIGINT(20)
    BEGIN
    DECLARE v_value BIGINT(20);
    DECLARE v_CYCLE CHAR;
    DECLARE v_MIN BIGINT(20);
    DECLARE v_MAX BIGINT(20);
    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_2 K WHERE K.Y =T.Y) WHERE T.X = V_X;
    Mysql: UPDATE TABLE T,TABLE_2 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;
    注释:
    1、#注释内容
    2、-- 注释内容  注意-- 后需要加一个空格
    3、块注释用/*注释内容*/
    表的注释:
    在oracle中执行如下语句:
    select 'altertable '||table_name||' comment'||' '''||COMMENTS||' '''||';' fromUSER_TAB_COMMENTS where comments is not null;
    将得到的结果放到mysql中执行即可添加表名的注释
    表的字段注释:
    在oracle中执行如下语句:
    select distinct(data_type)  FROM all_tab_columns where owner= 'YDMIS'
    将查询出的本次转换涉及到的数据类型用decode函数转换为Mysql中对应函数(参数)的形式,如将CHAR转换为CHAR(20),参数的值在 all_tab_columns的DATA_LENGTH  DATA_PRECISION  DATA_SCALE中取得。
    在oracle中执行如下语句,注意decode函数里的参数需根据上一步的查询结果转换:
    select 'altertable '||a.table_name||' modify column '||a.column_name||' '||decode(b.data_type,'VARCHAR2','VARCHAR('||b.DATA_LENGTH||')','DATE','DATETIME','NUMBER','DECIMAL('||b.DATA_PRECISION||','||b.DATA_SCALE||')','CHAR','CHAR('||b.DATA_LENGTH||')','LONGRAW','mediumblob')||' comment '||''''||comments||''''||';'
    from user_col_comments a,all_tab_columnsb
    where a.comments is not null
    and a.table_name = b.table_name
    and a.column_name = b.column_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',1,3) substring('abcd',1,3)
    string转换为date to_date() str_to_date(str, format) to_date(aae036,'yyyy-mm-dd hh24:mi:ss') str_to_date(aae036,'%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+1 DATE_ADD(date,INTERVAL expr type) sysdate+1 DATE_ADD(now() ,INTERVAL 1 DAY)
    类型转换 TO_CHAR
    TO_DATE
    TO_NUMBER cast(xxx as type) type:二进制 : BINARY
    字符型,可带参数 : CHAR()
    日期 : DATE
    时间: TIME
    日期时间型 : DATETIME
    浮点数 : DECIMAL
    整数 : SIGNED
    无符号整数 : UNSIGNED to_char(33) cast(33 as char(2))
    精度转换 to_number(x,type) round(x,d) 保留到小数点后d位,而第d位的保留方式为四舍五入。若要保留x值小数点左边的d位,可将d设为负值
    替换空值 NVL( string1, replace_with) ifnull(string1, replace_with)
    decode() decode (expression, search_1, result_1,  default) case expression when search_1 then result_1 else def

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