這個部分是自己隨便整理下。
在工作上需要,公司需要DB2兼容Oracle。
不懂DB2與Oracle的細節,這里努力整理,以后精通了再回來重新修改、
https://www.2cto.com/database/201207/144503.html。
1.數據類型轉換函數
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型。
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不同
10.獲取當前系統時間
ORACLE Sysdate
DB2 CURRENT DATE
11.