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