oracle转mysql数据库
一、在oracle上創建函數:
CREATE OR REPLACE procedure convert_date_to_timestamp isv_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;beginfor c_tabs in (select table_name from user_tables where table_name <> 'type_table_info')loopv_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.lastloop--DBMS_OUTPUT.put_line(table_array(i).column_name || ':' || table_array(i).data_type);if table_array(i).data_type = 'DATE' thenv_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函數
getData()函數
CREATE DEFINER=`root`@`%` FUNCTION `getDate`() RETURNS datetime BEGINDECLARE result datetime;RETURN NOW(); ENDGetTmpTableName()獲取表名:
CREATE DEFINER=`root`@`%` FUNCTION `GetTmpTableName`() RETURNS varchar(64) CHARSET utf8 BEGINDECLARE RetTableName varchar(64);SELECT REPLACE(UUID(),'-','') INTO RetTableName;SET RetTableName = CONCAT('TMP_',RetTableName);RETURN RetTableName; ENDnvl函數:
CREATE DEFINER=`root`@`%` FUNCTION `nvl`(f_judgevalue varchar(255), f_value varchar(255)) RETURNS varchar(255) CHARSET utf8 BEGINDECLARE result VARCHAR(255);SET result = IFNULL(f_judgevalue, f_value);RETURN result; ENDsys_guid()函數:
CREATE DEFINER=`root`@`%` FUNCTION `sys_guid`() RETURNS varchar(255) CHARSET utf8 BEGINRETURN UUID(); ENDto_char函數:
CREATE DEFINER=`root`@`%` FUNCTION `to_char`(f_date datetime, f_format varchar(255)) RETURNS varchar(255) CHARSET utf8 BEGINDECLARE result VARCHAR(255);SET f_format = UPPER(f_format);IF f_format = 'YYYY-MM-DD' THENSET f_format = '%Y-%m-%d';END IF;IF f_format = 'YYYYMM' THENSET f_format = '%Y%m';END IF;IF f_format = 'YYYY-MM' THENSET f_format = '%Y-%m';END IF;IF f_format = 'YYYY' THENSET f_format = '%Y';END IF;IF f_format = 'MM' THENSET f_format = '%m';END IF;IF f_format = 'DD' THENSET f_format = '%d';END IF;SET result = date_format(f_date, f_format);RETURN result; ENDto_data函數:
CREATE DEFINER=`root`@`%` FUNCTION `to_date`(f_str varchar(255) ,f_format varchar(255)) RETURNS varchar(255) CHARSET utf8 BEGINDECLARE result VARCHAR(255);SET f_format = TRIM(UPPER(f_format));IF f_format = 'YYYY-MM-DD' THENIF LENGTH(f_str) > 10 THENSET 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' THENSET f_format = '%Y-%m-%d %H:%i:%s';END IF;SET result = STR_TO_DATE(f_str,f_format);RETURN result; ENDgetChildList()函數:
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; ENDfunc_get_split_string_total函數:
CREATE DEFINER=`root`@`%` FUNCTION `func_get_split_string_total`(f_string varchar(1000),f_delimiter varchar(5)) RETURNS int(11) BEGINreturn 1+(length(f_string) - length(replace(f_string,f_delimiter,''))); ENDfunc_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 BEGINdeclare 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類型
總結
以上是生活随笔為你收集整理的oracle转mysql数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里巴巴发送短信接口的使用
- 下一篇: Java必备主流技术流程图