cast函数 oracle 日期_从Oracle到PG 该做的改造工作一个都不能少!
作者 ?Iris ? (PG深度愛好者)
一、項目描述
前段時間剛完成一個應用ORACLE改造的項目,數據體量比較大,業務改造的周期計劃比較短,再加上自研分布式MYSQL對事務、存儲過程等限制,所以應用方放棄了改造分布式數據庫MYSQL的想法。很多研發人員對PG的了解不深,產生一個誤區,認為PG近乎等于ORACLE,并無多大改造體量。然后現實很快就被打臉了。現實就是,該做的改造工作一個都不能少,畢竟是異構數據庫,字段和語法的差異都是項目改造的基礎。
二、需求分析
為了完成Oracle到PG的改造工作,將改造的工作分為以下兩類:
數據遷移:表、視圖、數據、序列、存過(及函數)、JOB定時任務等,按照需要遷移到Postgre中。
程序改造:后臺所有的微服務工程,需要修改數據庫連接配置及所有Mybatis的SQL語句需要改造適應Postgre
三、改造說明
Oracle和Postgre數據庫的差異方面很多,現在列舉此項目改造中常用到的一些差異如下:
3.1 數據類型差異
Oracle | Postgre |
Varchar2 | Varchar |
Date | Date/time/timestamp |
Clob | Text |
Blob | Bytea |
Number | Smallint/integer/bigint/numeric/real/double precision |
3.2 函數或語法差異
項目 | Oracle | Postgre |
字符串連接 | || | ||或者使用concat() |
'A'||NULL | 'A' | NULL |
null和’’ | 沒區別 | 有區別 |
Trunc(時間) | Trunc(date) | Date_trunc(date) |
當前系統時間 | Sysdate | Now()或localtimestamp |
TO_CHAR,TO_NUMBER,TO_DATE | 自動格式轉換 | 需指定格式 |
空值轉換函數 | NVL | COALESCE |
轉義函數 | DECODE | 沒有,只能CASE WHEN 實現 |
Outer join | (+) | Left(righ) join |
序列值獲取 | SEQ_NAME.NEXTVAL(新值) SEQ_NAME.CURRVAL(會話當前值) | NEXTVAL('SEQ_NAME') (新值) CURRVAL('SEQ_NAME') (會話當前值) |
虛表DUAL | DUAL | 自建視圖dual |
函數繼承或承載 | 不支持 | 支持 |
行號 | ROWNUM | 沒有,可以通過ROW_NUMBER() OVER ()代替 |
分頁查詢 | ROWNUM BETWEEN 開始位置 AND 結束位置 | LIMIT 數據量 OFFSET 開始位置 |
類型自動轉換 | 支持 | 不支持,需要顯示轉換,或者添加CAST, |
子查詢別名 | 可以不需要 | 必須指定別名 |
遞歸查詢 | start with … connect by… | with recusive |
更新字段別名 | 更新字段可以使用表別名引用字段 | 更新字段時SET后面的字段不能出現別名 |
日期加減 | 天數直接用+-,月份用ADD_MONTHS(date,int) | + INTERVAL '1 YEAR 1 MONTH -1 DAY' |
別名 | 可以省略AS關鍵字 | 特殊關鍵字名字的別名必須加AS |
查找字符串位置 | INSTR('12345', '3') | POSITION('3' IN '12345') |
數據記錄ID | Rowid | Ctid |
3.3 應用程序改造
所有微服務都需要進行改造,需要數據庫連接修改及SQL配置文件的改造。
現有微服務工程如下:
工程 | 備注 |
config-client | |
config-server | |
eureka-server-1.5.2 | |
fault-service | |
ggzs-service | 對接公共助手 |
it.wisdom | |
jeesite.api | |
upedc-service | |
wisdom-api-app-menu | app菜單 |
wisdom-api-event | |
wisdom-api-gateway | 網關 |
wisdom-auth-service | 認證服務 |
wisdom-bo-service | |
wisdom-eareka-server | eareka服務 |
wisdom-interface | |
wisdom-order | |
wisdom-report | 報表 |
wisdom-schedule | 調度任務 |
wisdom-service | |
wisdom-storm-service | |
wisdom-web-assessment-service | 員工評估等數據后臺數據查詢處理等 |
wisdom-web-bo-service | 端到端數據查詢 |
wisdom-web-operator-service | |
wisdom-web-operator-sms-service | |
wisdom-web-operator-useranalysis-service | |
wisdom-web-sys-service | 系統管理 |
wisdom-web-user-service | 用戶管理 |
wisdom-web-vendor-assessment-service | |
wisdom-web-ws-service | 對外提供WS接口 |
四、數據遷移
數據遷移工具用的是Ora2pg,數據遷移對象包含有323張表,32個序列,21個視圖,8個函數,43個存儲過程,以及16個JOB。具體的遷移過程略。可以參考Ora2pg官方幫助文檔:http://ora2pg.darold.net/documentation.html
遷移問題處理
1、BLOB==>bytea 讀出數據導出為文件時,不能直接做為BLOB數據類型導出需要改成:
2、NUMBER==>NUMERIC 通過mybatis寫入數據時,如果數據本身是VARCHAR,不能通過#{item.callfailnum,jdbcType=DECIMAL}轉為DECIMAL寫入數據,需要改成:#{item.callfailnum,jdbcType=VARCHAR}::DECIMAL
3、數據類型嚴格檢查,ORACLE中,數據類型可以自動進行轉換,而POSTGRE需要嚴格根據數據類型編寫SQL,如果字段XXX為NUMBER類型,在ORACLE中可以寫為XXX='3',而在POSTGRE中必須寫為XXX=3
4、navicat 11的版本過低,無法圖形化導出腳本。建議提供navicat 15的版本。當然最好是使用PGADMIN工具。
總結
以上是生活随笔為你收集整理的cast函数 oracle 日期_从Oracle到PG 该做的改造工作一个都不能少!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么让热图显示基因名_R 生信数据可视化
- 下一篇: 在线编辑_水墨-在线 Markdown