oracle转mysql数据库
一、在oracle上创建函数:CREATE OR REPLACEprocedure convert_date_to_timestampisv_query_base_sql varchar2(100) := 'SELECT table_name, column_name, data_type FROM all_tab_cols WHERE table_name = ''';v_qu...
一、在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类型
更多推荐
所有评论(0)