这个部分是自己随便整理下。
在工作上需要,公司需要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.