oracle移植mysql方案_系统从MySQL迁移至ORACLE实现方案
一、數據庫腳本遷移
1、數據結構同步
打開Navicat Premium,點擊菜單【工具】-【數據傳輸】,在彈出的對話框中選擇對應的源庫和目標庫。
為使用方便,請在TAB頁【高級】中,將【轉換對象名為】勾選,并選擇【大寫】。設置完成后點擊【開始】按鈕即可進行數據腳本同步。
注意:數據傳輸過程中,可能會因為MySQL數據庫設計的不規范導致出現異常,請及時修正源庫對應的數據結構。Oracle中標識符的最大長度是30個字符,標識符包括但不限于表名、字段名、視圖名、序列名、主鍵。
2、表結構調整
Navicat Premium數據同步時,不對列長度進行精確設置(保留默認長度),故需要在數據結構同步完成以后再將Oracle數據庫腳本導出并對列的長度進行精確的設置。
注意:Oracle數據庫表中有數據時不能直接修改表結構,所以建議導出數據庫腳本,在腳本中進行修改。另外,Navicat Premium導出的SQL包含前綴和雙引號,請在導出后去除。
3、添加sequence
Oracle表的主鍵自增是通過sequence實現的,故需要為表自增主鍵添加sequence,sequence創建示例如下:
CREATE SEQUENCE SEQ_ACCOUNT_INFO INCREMENT BY 1 START WITH 1 minvalue 1 NOMAXVALUE NOCACHE;
二、系統配置調整
1、pom文件中添加Oracle數據庫驅動
com.oracle
ojdbc14
10.2.0.4.0
system
${project_basedir}/lib/ojdbc14-10.2.0.4.0.jar
2、調整數據源
jdbc.properties配置調整
db.driverClassName=oracle.jdbc.driver.OracleDriver
db.url=jdbc:oracle:thin:@10.10.1.107:1521:orcl
db.username=root
db.password=root
db.mapper=classpath:mybatis/oracle/*Mapper.xml
validationQuery=SELECT 'x' FROM DUAL
三、Java后臺調整
1、 Mapper文件中,自增主鍵調整為Oracle的sequence方式
原MySQL的方式如下:
SELECT LAST_INSERT_ID()
Oracle的sequence方式如下:
SELECT SEQ_ACCOUNT_INFO.NEXTVAL FROM DUAL
2、日期(時間)類型調整
日期格式化
MySQL數據庫通過DATE_FORMAT(date,format)函數將日期格式化為字符串,其中format可用的標識符有:%Y(年)、%m(月)、%H(小時)、%i(分鐘)、%S(秒)等等,常用的格式有'%Y-%m-%d'、'%H:%i:%S'、'%Y%m'等。
Oracle數據庫使用TO_CHAR(date,format)函數對日期進行格式化,如對當前日期進行格式化:TO_CHAR(SYSDATE,'yyyy-mm-dd HH:mi:ss')。
另外,MySQL是弱類型的數據類型,在字符串轉日期(其他類型也一樣)時只要符合日期格式不需要進行類型轉換,但是Oracle必須進行類型轉換。Oracle提供了TO_DATE(date_str,'yyyy-mm-dd hh24:mi:ss')函數將字符串轉換為日期類型。
取當前日期的函數
MySQL常用取當前日期(時間)的函數有:NOW()、SYSDATE()、CURDATE()、CURTIME()等。Oracle中使用SYSDATE。
計算時間差
MySQL數據庫使用TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)函數來計算時差,其中interval可以是YEAR(年)、QUARTER(季度)、MONTH(月)、WEEK(星期)、DAY(天)、HOUR(小時)、MINUTE(分鐘)、SECOND(秒) 、FRAC_SECOND(毫秒),如計算2017年五一勞動節距今的天數:
SELECT TIMESTAMPDIFF(day,'2017-05-01',now());
MySQL還有很多計算時間差的函數,如DATEDIFF(date1,date2)等。
Oracle數據庫直接通過兩日期相減來實現時間差的計算,如計算2017年五一勞動節距今的天數:
SELECT FLOOR(SYSDATE-TO_DATE('2017-5-1','yyyy-mm-dd')) FROM DUAL ;
計算2017年五一距今的小時數:
SELECT FLOOR(TO_NUMBER(SYSDATE-TO_DATE('2017-5-1 00:00:00','yyyy-mm-dd hh24:mi:ss'))*24) FROM DUAL ;
3、模糊查詢
MySQL使用
concat('%',#{keywords},'%')
Oracle中使用
'%'||#{keywords}||'%'
四、 常見問題
1、去除重復列,防止在oracle分頁查詢時報錯:ORA-00918: 未明確定義列。
2、出現ORA-00942: 表或視圖不存在錯誤,可能是數據庫表名錯誤,也可能是沒有權限或者賬號不存在等等。
3、MySQL 字符串支持單引號和雙引號,但Oracle只支持單引號。
4、Oracle里進行分組統計時,非聚合列必須全部放在group by 子句中。如果還涉及到排序,排序的列也必須在group by 子句中。MySQL 5.7之前對分組統計沒有強制約束,5.7之后 和oracle遵循相同的標準。
5、不能在Oracle的GROUP BY子句中使用列別名。
6、Oracle 中別名不能加單引號。
7、MySQL 的批量插入、更新轉換為 Oracle 的批量插入、更新時需加上begin end
BEGIN
statement
; END ;
總結
以上是生活随笔為你收集整理的oracle移植mysql方案_系统从MySQL迁移至ORACLE实现方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python回归方程系数计算_线性回归中
- 下一篇: mysql-proxy myrelay_