转载:DB2、ORACLE SQL写法的首要差异ITeye - AG环亚娱乐

转载:DB2、ORACLE SQL写法的首要差异ITeye

2019年02月20日11时10分38秒 | 作者: 忆文 | 标签: 字符串,函数,方法 | 浏览: 269

说实话,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型

property name="createTime" type="java.util.Date"

  column name="CREATE_TIME" length="7" /

/property

则在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

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表AG环亚娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章