一、在oracle上创建函数:

CREATE OR REPLACE
procedure convert_date_to_timestamp
is
  v_query_base_sql varchar2(100) := 'SELECT table_name, column_name, data_type FROM all_tab_cols WHERE table_name = ''';
  v_query_table_sql varchar2(150);
  v_alter_sql varchar2(100);

  type table_type is table of type_table_info%rowtype;
  table_array table_type;

begin
  for c_tabs in (
       select table_name from user_tables where table_name <> 'type_table_info'
    )
    loop
      v_query_table_sql := v_query_base_sql || c_tabs.table_name || '''';
      execute immediate v_query_table_sql bulk collect into table_array;
      for i in table_array.first .. table_array.last
        loop
          --DBMS_OUTPUT.put_line(table_array(i).column_name || ':' || table_array(i).data_type);
          if table_array(i).data_type = 'DATE' then
            v_alter_sql := 'alter table ' || table_array(i).table_name || ' modify ' || table_array(i).column_name || ' timestamp';
            DBMS_OUTPUT.put_line(table_array(i).column_name || ': ' || v_alter_sql);
            execute immediate v_alter_sql;
          end if;

        end loop;
    end loop;
end convert_date_to_timestamp;

**二、安装NAVICAT Premium,网上有好多教程,直接下载并破解安装,最好在官网下载,然后破解。官网地址:**https://www.navicat.com.cn/products
三、使用navicat进行转换:
打开navicat链接oracle和mysql库,作为程序员,这个一般都会。
点击数据传输:
在这里插入图片描述
选择数据库:
在这里插入图片描述
下一步,选择你要转换的表:(建议每次少选一点,一次50张表左右,如果太多会失败)
在这里插入图片描述
点击开始,进行转换。(转换过程中会报错,你要自己查看报错信息,然后更改表结构,当mysql成功后,在转换回去。)
四、转换mysql的字段类型
Oracle的NUMBER数值类型被自动转换为decimal类型,需手工做以下字段类型/结构修改:
(1)对于存放整型值的字段,需修改为int型。
(2)对于存放非整型字段(例如金额、单价等),如果在Oracle中未限定小数位数,则转换后小数位数自动变为 0,需根据实际需要修改小数位数。(金额8位,数量3位)
2、Oracle中varchar2的长度超过255的字段,会被自动转为text类型,需要手工改为varchar(实际长度)。
3、Oracle中的BLOB字段类型自动被转换为longblob,因为longblob类型的查询的时候比较慢,需要手工改为mediumBlob类型
五、在mysql上创建oracle的函数
oracle上的add_months函数

CREATE DEFINER=`root`@`%` FUNCTION `add_months`(f_date datetime ,f_val int) RETURNS datetime
BEGIN
	DECLARE result datetime;

	SET result = date_add(f_date,INTERVAL f_val MONTH);

	RETURN result;
END

getData()函数

CREATE DEFINER=`root`@`%` FUNCTION `getDate`() RETURNS datetime
BEGIN
	DECLARE result datetime;

	RETURN NOW();
END

GetTmpTableName()获取表名:

CREATE DEFINER=`root`@`%` FUNCTION `GetTmpTableName`() RETURNS varchar(64) CHARSET utf8
BEGIN
    DECLARE RetTableName varchar(64);
    SELECT REPLACE(UUID(),'-','') INTO RetTableName;

    SET RetTableName = CONCAT('TMP_',RetTableName);
    RETURN RetTableName;
END

nvl函数:

CREATE DEFINER=`root`@`%` FUNCTION `nvl`(f_judgevalue varchar(255), f_value varchar(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
	DECLARE result VARCHAR(255);
	
	SET result = IFNULL(f_judgevalue, f_value);

	RETURN result;
END

sys_guid()函数:

CREATE DEFINER=`root`@`%` FUNCTION `sys_guid`() RETURNS varchar(255) CHARSET utf8
BEGIN
	RETURN UUID();
END

to_char函数:

CREATE DEFINER=`root`@`%` FUNCTION `to_char`(f_date datetime, f_format varchar(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
	DECLARE result VARCHAR(255);
	
	SET f_format = UPPER(f_format);

	IF f_format = 'YYYY-MM-DD' THEN
		SET f_format = '%Y-%m-%d';
	END IF;

	IF f_format = 'YYYYMM' THEN
		SET f_format = '%Y%m';
	END IF;

	IF f_format = 'YYYY-MM' THEN
		SET f_format = '%Y-%m';
	END IF;

	IF f_format = 'YYYY' THEN
		SET f_format = '%Y';
	END IF;

	IF f_format = 'MM' THEN
		SET f_format = '%m';
	END IF;

	IF f_format = 'DD' THEN
		SET f_format = '%d';
	END IF;
	
	SET result = date_format(f_date, f_format);

	RETURN result;
END

to_data函数:

CREATE DEFINER=`root`@`%` FUNCTION `to_date`(f_str varchar(255) ,f_format varchar(255)) RETURNS varchar(255) CHARSET utf8
BEGIN
	DECLARE result VARCHAR(255);
	
	SET f_format = TRIM(UPPER(f_format));

	IF f_format = 'YYYY-MM-DD' THEN
		IF LENGTH(f_str) > 10 THEN
			SET f_str = SUBSTRING(f_str , 1 , 10);
		END IF;
		SET f_format = '%Y-%m-%d';
	END IF;

	IF f_format = 'YYYY-MM-DD HH24:MI:SS' THEN
		SET f_format = '%Y-%m-%d %H:%i:%s';
	END IF;

	SET result = STR_TO_DATE(f_str,f_format);

	RETURN result;
END

getChildList()函数:

CREATE DEFINER=`root`@`%` FUNCTION `getChildList`(rootId INT) RETURNS varchar(1000) CHARSET utf8
BEGIN 
       DECLARE pTemp VARCHAR(21845);  
       DECLARE cTemp VARCHAR(21845); 
      
       SET pTemp = '$';  
       SET cTemp =cast(rootId as CHAR); 
      
       WHILE cTemp is not null DO  
         SET pTemp = concat(pTemp,',',cTemp);  
         SELECT group_concat(uqaccountid) INTO cTemp FROM tgl_accounts   
         WHERE FIND_IN_SET(uqparentid,cTemp)>0; 
       END WHILE;  
       RETURN pTemp;  
     END

func_get_split_string_total函数:

CREATE DEFINER=`root`@`%` FUNCTION `func_get_split_string_total`(f_string varchar(1000),f_delimiter varchar(5)) RETURNS int(11)
BEGIN

  return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')));
END

func_get_split_string函数:

CREATE DEFINER=`root`@`%` FUNCTION `func_get_split_string`(f_string varchar(1000),f_delimiter varchar(5),f_order int) RETURNS varchar(255) CHARSET utf8
BEGIN

    declare result varchar(255) default '';
    set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1));
    return result;
END

注:大家转换的时候,直接把这些函数创建了,这些事oracle的常用函数,如果你用到其他oracle函数,你就要自己重写。
六、修改程序
这一点最为麻烦,你要修改所有的代码,oracle的ROWNUM关键字要改成mysql的limit。
七、注意的问题
1、Oracle的NUMBER数值类型被自动转换为decimal类型,需手工做以下字段类型/结构修改:
(1)对于存放整型值的字段,需修改为int型。
(2)对于存放非整型字段(例如金额、单价等),如果在Oracle中未限定小数位数,则转换后小数位数自动变为 0,需根据实际需要修改小数位数。(金额8位,数量3位)
2、Oracle中varchar2的长度超过255的字段,会被自动转为text类型,需要手工改为varchar(实际长度)。
3、Oracle中的BLOB字段类型自动被转换为longblob,因为longblob类型的查询的时候比较慢,需要手工改为mediumBlob类型

Logo

更多推荐