新闻中心> 文章详情

南京OCP培训 DB2与Oracle数据库SQL写法的主要区别

2015年12月04日

  说实话,Oracle把国内的程序员惯坏了,代码中的SQL充斥着大量Oracle特性,几乎没人知道ANSI的标准SQL是什么样子,导致程序脱离了Oracle根本无法运行,还好随着hibernate的流行,情况有了很大改观。南京Oracle认证培训

 

  DB2作为众多国际大客户的选择(据说世界500强80%用DB2,前100强更是全部采用DB2),在国内真的很不流行,属于小众数据库,但是没办法,现在的项目要用DB2,所以不得不面对熟悉Oracle的开发同事们写出的“Oracle版代码”,众多的兼容性问题搞得很是头大,遂整理了一份经常遇到的兼容性问题列表供大家参考,貌似最近问题少了些,但愿这个势头能继续下去。南京Oracle认证培训

 

  1、数据类型转换函数

南京Oracle培训 DB2与Oracle数据库SQL写法的主要区别
 

 

  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下是非法的。南京Oracle认证培训

 

  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型 南京OCP培训

 

  一个采用hibernate后常见的兼容问题是:

 

  如果在映射文件中定义了某个字段为Date型

 

  则在DB2下,此字段必须定义为timestamp,而不能定义成DATE,不然会报出字符串右截断的错误

 

  对于DB2来说,在查询条件中可以直接用字符串指定日期或时间戳类型字段的值,例如 where create_date = '2007-04-26' 、where create_timestamp = '2007-04-26 08:08:08' ,无须使用字符串转日期函数。南京Oracle认证培训

 

  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  南京OCP培训

 

  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)就出错了    南京OCP培训

 

  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  南京Oracle认证培训

 

  都没有问题

 

  10、获取操作系统当前日期

 

  Oracle Sysdate

 

  DB2 CURRENT DATE 


上一篇下一篇
按时发顺丰

技术交流群

Java大数据交流群560819979    加入
Python技术交流群595083299    加入
Oracle技术交流群595119011    加入
Web前端技术交流群604697610    加入
Huawei技术交流群482919361    加入
Redhat技术交流群587875348    加入
UI设计技术交流群511649801    加入
Cisco技术交流群596886705    加入
IT运维技术交流群605888381    加入