DB2與Oracle資料庫SQL寫法的主要區別

2021-01-08 IT168

  【IT168 技術】說實話,Oracle把國內的程式設計師慣壞了,代碼中的SQL充斥著大量Oracle特性,幾乎沒人知道ANSI的標準SQL是什麼樣子,導致程序脫離了Oracle根本無法運行,還好隨著hibernate的流行,情況有了很大改觀。

  DB2作為眾多國際大客戶的選擇(據說世界500強80%用DB2,前100強更是全部採用DB2),在國內真的很不流行,屬於小眾資料庫,但是沒辦法,現在的項目要用DB2,所以不得不面對熟悉Oracle的開發同事們寫出的「Oracle版代碼」,眾多的兼容性問題搞得很是頭大,遂整理了一份經常遇到的兼容性問題列表供大家參考,貌似最近問題少了些,但願這個勢頭能繼續下去。

  1、數據類型轉換函數

 

整型轉字符型

字符串轉整形

字符串轉浮點型

浮點型轉字符串

字符串轉日期

字符串轉時間戳

日期轉字符串

ORACLE

to_char(1)

to_number('1')

to_number('1.1')

to_char(1.1)

to_date('2007-04-26','yyyy-mm-dd')

to_date('2007-04-26 08:08:08','YYYY-MM-DD HH24:MI:SS')

to_char(to_date('2007-04-29','yyyy-mm-dd'),'yyyy-mm-dd')

DB2

char(1)

int('1')

double('1.1')

char(1.1)

date('2007-04-26')

to_date('2007-04-26 08:08:08','YYYY-MM-DD HH24:MI:SS')

char(date('2007-04-29'))

兼容寫法

cast(1 as char)

cast('1' as int)

兼容

  2、Where條件弱類型判斷

  oracle: where 字符型欄位 in (整形) 是允許,DB2不允許

  select 'abc' from dual where '1' in (1) 在oracle下可通過

  select 'abc' from sysibm.sysdummy1 where '1' in (1) 在DB2下報錯

  oracle:where 字符型欄位=數字型欄位 允許,DB2不允許

  select 'abc' from dual where '1'=1 在oracle下可通過

  select 'abc' from sysibm.sysdummy1 whre '1'=1 在DB2下報錯

  3、replace關鍵字

  oracle支持,DB2不支持 create or replace語句在DB2下是非法的

  4、子查詢別名

  Oracle 支持select * from(select 1 from dual) 或者 select * from(select 1 from dual) t

  DB2 支持select * from(select 1 from sysibm.sysdummy1) t 或者 select * from(select 1 from sysibm.sysdummy1) as t

  固兼容的寫法是select * from(子查詢) t

  5、DATE數據類型的區別

  Oracle中DATE型也是帶有時分秒的,但DB2下DATE只是年月日,如'2007-04-28',且可作為字符串直接操作,DB2中要記錄時分秒必須採用TIMESTAMP型

  一個採用hibernate後常見的兼容問題是:

  如果在映射文件中定義了某個欄位為Date型

  則在DB2下,此欄位必須定義為timestamp,而不能定義成DATE,不然會報出字符串右截斷的錯誤

  對於DB2來說,在查詢條件中可以直接用字符串指定日期或時間戳類型欄位的值,例如 where create_date = '2007-04-26' 、where create_timestamp = '2007-04-26 08:08:08' ,無須使用字符串轉日期函數

  6、分頁的處理

  如果採用JDBC分頁的話,注意rownum在DB2中不受支持,比如從masa_area表中取得area_id最小的10條記錄,語句分別如下,注意這裡的別名t書寫方法

  Oracle: select t.* from (select rownum as r1 ,masa_area.* from masa_area order by area_id) t where t.r1<=10

  DB2: select t.* from (select rownumber() over() as r1 ,masa_area.* from masa_area order by area_id) t where t.r1<=10

  7、decode函數

  decode函數在DB2不被支持,兼容的寫法是採用case when

  8、NVL函數

  nvl寫法在DB2不被支持,兼容的寫法是採用coalesce

  Oracle: select NVL(f_areaid,'空') from masa_user 等同於 select coalesce(f_areaid,'空',f_areaid) from masa_user

  DB2: select coalesce(f_areaid,'空',f_areaid) from masa_user

  9、substr的不同

  DB2 substr舉例如下:

  masa_group表的f_groupCode欄位定義成VARCHAR(100),所以下面這個語句不會出錯,如果是substr(f_groupCode,1,101)就出錯了

  select * from masa_group where substr(f_groupCode,1,50) = '001006' order by f_groupcode

  在DB2下無錯,但是

  select * from masa_group where substr('001006', 1, 50) = '001006' order by f_groupcode

  就報錯,說第三個參數超限

  這是因為'001006'已經定義為一個長度為6的charater了

  這點和Oracle有很大不同,請大家注意

  如果是要從第一位取到最後一位,穩妥的辦法是不要加第三個參數

  Oracle:select substr('123456',1) from dual

  DB2:select substr('123456',1) from sysibm.sysdummy1

  都沒有問題

  10、獲取作業系統當前日期

  Oracle Sysdate

  DB2 CURRENT DATE

相關焦點

  • 極致查詢性能 sqltoy-orm-4.12.8 發版增加對國產達夢資料庫支持
    更新內容1、主要增加對國產達夢資料庫的支持(目前除updateFetch
  • sagacity-sqltoy 4.17.8 發布,Java ORM 框架
    sagacity-sqltoy 4.17.8 已經發布,此版本更新內容包括:1、支持緩存翻譯未匹配模板設置為空白或空字符串: uncached-template=""(之前空白當成無效設置
  • 極致性能 sqltoy-orm-4.12.9 發版 - OSCHINA - 中文開源技術交流...
    5、quickvo 將欄位對應資料庫原始類型作為vo屬性備註輸出,便於調整類型匹配sqltoy特點說明: 支持mysql、postgresql、db2、oracle、sqlserver、sqlite、clickhouse、elasticsearch、mongodb等
  • Oracle19C DataGuard搭建
    (啟動實例並加載資料庫,但不打開)4)SQL> alter database archivelog; (更改資料庫為歸檔模式)5)alter database force logging; (設置強制歸檔)(2)sql>select name,force_logging
  • Oracle資料庫二
    一、Oracle資料庫的目錄結構在安裝完Oracle資料庫後,來看一下Oracle的目錄結構:在 Oracle 中一個實例只能 操作一個資料庫。如果安裝多個庫那麼就會有多個實例,我們可以通過實例 SID 來區分。 由於 Oracle 中一個實例只能操作一個資料庫的原因 oracle 中也會使用 SID 來作為庫的名稱。2.cfgtoollogs目錄
  • MySQL 資料庫的哈希表-愛可生
    數組在各個開發語言以及資料庫中都有類似的結構,類似下圖1:圖 1 展示了一個一維整數數組,數組的長度為 10,下標從 0-9, 每個下標對應不同的值。"],"oracle","mongodb","sql server","redis""memcached","dble",
  • Oracle DBA之常用SQL
    warningfrom dba_free_spacegroup by tablespace_name)order by 4;--查看資料庫數據大小Gselect sum(bytes/1024/1024/1024) "db size(G)" from dba_segments;--查看資料庫大小(G),按用戶分組
  • sqltoy-orm-4.16.11 發版,部分功能優化
    的十四個關鍵特點:1、最簡最直觀的sql編寫方式(不僅僅是查詢語句),採用條件參數前置處理規整法,讓sql語句部分跟客戶端保持高度一致2、sql中支持注釋(規避了對hint特性的影響,知道hint嗎?搜oracle hint),和動態更新加載,便於開發和後期維護整個過程的管理3、支持緩存翻譯和反向緩存條件檢索(通過緩存將名稱匹配成精確的key),實現sql簡化和性能大幅提升4、支持快速分頁和分頁優化功能,實現分頁最高級別的優化,同時還考慮到了cte多個with as情況下的優化支持5、支持並行查詢6、根本杜絕sql注入問題,以後不需要討論這個話題7、支持行列轉換
  • JAVA-新手入門:JAVA資料庫基本操作指南
    java 資料庫基本操作  1、java資料庫操作基本流程  2、幾個常用的重要技巧:  ·可滾動、更新的記錄集  ·批量更新  ·事務處理java資料庫操作基本流程:取得資料庫連接 - 執行sql語句 - 處理執行結果 - 釋放資料庫連接基礎視頻有挺多的你是看你的學習欲望!!!!
  • sqltoy-orm-4.16.16 發版,並行查詢場景增強、級聯增加排序
    -- <table name="SQLTOY_DICT_DETAIL" update-cascade="delete" load="STATUS=1" orderBy=""/> --></cascade>2、並行查詢可以自行設置每個查詢的條件參數3、優化findEntity 資料庫關鍵詞的處理4、sqltoy-boot-starter
  • sql替換資料庫欄位中的字符
    某些時候我們要修改資料庫欄位中的部分字符串,如果內容少時一個一個替換,內容多時,就不能一個一個的替換了,因為這樣不僅耗時還容易出錯。下面就用sql批量進行替換。替換shopping_hw表中欄位hw_pic,內容「*common」替換為「+play」.
  • 如何減少oracle資料庫死鎖
    今天中午oracle系統死鎖,在30多萬行代碼裡面排查半天,原來是有段代碼的事務沒有提交。#程式設計師# 很多時候漏提交時務,就會造成災難性的後果,因此寫完代碼再檢查一遍,還是有必要的。tryif not dbMain.InTransaction then dbMain.StartTransaction;∥操作資料庫代碼if dmdatapublic.dbMain.InTransaction then dmdatapublic.dbMain.Commit
  • 5天,2W+字整理資料庫實操指令,附練習題,再說資料庫學不明白
    朋友工作的原因,端午節也沒閒著,陪這個禍害整理了一下資料庫的sql指令,並且整理配套的習題進行練習使用,我正好也沒啥事,疫情的原因啥也幹不了,就陪他整理一波,順便薅一波羊毛,嘿嘿嘿不過,因為真的是文字太多了,所以只展示一部分,需要完整文檔以及sql文件的,關注+轉發後,私信「資料」查看獲取方式把
  • BeetlSQL 3.1.2 發布,Java 資料庫訪問工具
    文件到Maven工程的路徑錯誤 代碼生成Pojo信息未包含主鍵信息 代碼生成math包導入錯誤 PageRequest 實現序列化接口<dependency> <groupId>com.ibeetl</groupId> <artifactId>beetlsql
  • 工作中,我們經常用到哪些SQL語句呢?
    工作中我們基本上每天都要與資料庫打交道,資料庫的知識點呢也特別多,全部記住呢也是不可能的,也沒必要把所有的記住(有些語句命令可能我們一輩子都用不到)。所以呢在工作之餘,把工作中經常用到的一些語句整理出來,忘記的時候可以當做字典來查。個人在工作中用Oracle資料庫比較多,就以關係型資料庫Oracle為例進行整理,後面可能會整理一些非關係型資料庫,如mogodb之類的。
  • 資料庫周刊31丨華為高斯開源;國產資料庫排行;浙江移動AntDB……
    openGauss是一款開源關係型資料庫管理系統,深度融合華為在資料庫領域多年的深入積累和實踐經驗,結合企業級場景需求,持續構建競爭力。同時openGauss也是一個開源、免費的資料庫平臺,鼓勵社區進行貢獻、合作。
  • Oracle資料庫:imp導入數據指定表空間_DOIT.com.cn
    基本思路都是先從 USER1導出表結構(DMP或者SQL腳本),然後在USER2用戶下創建空的資料庫表(如果是DMP,則參見方法1;如果是SQL腳本,則稍作修改後以USER2用戶執行即可),再將包括數據的DMP導入,注意要設IGNORE=Y,並指定FROMUSER和TOUSER。具體實現方法為:(1)先用工具導出USER1的表結構(不要導出CHECK和FK,特別是FK!)
  • 第02篇:SQL資料庫的四種基本操作「增刪改查」
    操作資料庫使用的是SQL語言,其全稱:結構化查詢語言(Structured Query Language)。這是一門標準的計算機語言,用來訪問和操作資料庫系統。01為什麼要使用SQL應用程式需要通過SQL語句才能與資料庫打交道。