DB2、ORACLE SQL写法的主要区别

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

时间: 2024-11-10 13:48:45

DB2、ORACLE SQL写法的主要区别的相关文章

DB2常用SQL的写法(未整理)

UPDATE FROM update   a   set   aa   =(select   bb   from   b   where   a.cc   =   b.cc)     where   exists   (select   b.cc   from   a.cc   =b.cc) 1. 建立数据库DB2_GCB CREATE DATABASE DB2_GCB ON G: ALIAS DB2_GCB USING CODESET GBK TERRITORY CN COLLATE USIN

db2和oracle sql 语句中计算两个时间差的语法

db2 sql语句中计算两个日期相差的语法 结束日期为:2015-10-10  11:30:00 开始日期为:2015-09-09  10:40:00 (1)timestampdiff(8,char(结束时间-开始时间) )(加时分秒计算,会舍去零数)值为744小时 (2)(days(结束时间)-days(开始时间))*24 +hour(结束时间)-hour(开始时间) (不加时分秒计算)值为745小时 (3)Days(结束日期)-days(开始日期)的值为31天 (4)Day(结束日期)-da

触发器实现对插入数据的字段更改 Oracle+SQL Server

最近有个使用触发器实现对插入数据的某个列做更改的需求,因此整理了Oracle和SQL Server对于此类需求的触发器写法,本文仅提到了Insert触发器. 首先我们创建一张表: --创建Test表 Create table test(id int primary key,name varchar(20),sex varchar(1),status int) 我们的目的是实现新插入的数据满足sex字段为null时就把status设为1的需求,可根据实际需要更改条件. 因此SQL Server的写

Oracle SQL篇(一)null值之初体验

    从我第一次正式的写sql语句到现在,已经超过10年的时间了.我写报表,做统计分析和财务对账,我一点点的接触oracle数据库,并尝试深入了解.这条路,一走就是10年,从充满热情,到开始厌倦,我不知道我还能坚持多久,未来的路,谁知道呢? 也许是该抓紧时间,做一点什么了,我不知道该开始写些什么,我从来没有在网上写东西的习惯.     先从简单的开始吧,那当然就是SQL,这是我SQL系列的第一篇,希望我能够坚持. 在Oracle数据库中,如果一个表中的列没有值的话,我们可以说是空值,比如IT员

oracle sql 高级编程 历史笔记整理

20130909 周一 oracle sql 开发指南 第7章 高级查询 1.层次化查询select level,ttt.*,sys_connect_by_path(ttt.col1,',') from ttt start with .. Connect by prior -因为先建立树,再进行where过滤的.在where中过滤和在cooonect by中过滤是不一样的. 2.rollup cube高级查询 select grouping(col1) .. From ttt group by

ORACLE SQL 组函数【weber出品必属精品】

组函数:对一组数据进行加工,每组数据返回一个值 常用的组函数:count()  avg()  max()   min()  sum()   count()函数  1. count(*) :返回总共的行数,不去除NULL值 2. count(column):返回非NULL行的数量 SQL> select count(*) ,count(sal),count(comm) from emp; COUNT(*) COUNT(SAL) COUNT(COMM) ---------- ---------- -

[Oracle]关于Oracle分页写法的性能分析及ROWNUM说明

关于分页写法的性能分析及ROWNUM的补充说明 分页写法 一.测试前数据准备 SQL> SELECT COUNT(*) FROM BPM_PROCVAR; COUNT(*) ---------- 2121400 1.分页写法一 SELECT * FROM (SELECT ROWNUM RN, A.* FROM (SELECT * FROM BPM_PROCVAR ORDER BY VARID) A WHERE ROWNUM <= 40) B WHERE B.RN >= 21; 查询结果:

数据库触发器DB2和SQL Server的异同

大部分数据库语句的基本语法是相同的,但具体要具体的每一种数据库,又有些不一样,例如触发器,DB2和SQL Server两种很大的不同. 例如DB2的一个触发器: CREATE TRIGGER EAS.trName NO CASCADE BEFORE insert //插入触发器 ON eas.T_user REFERENCING NEW AS N_ROW //把新插入的数据命名为N_ROW FOR EACH ROW MODE DB2SQL //每一行插入数据都出发此操作 BEGIN ATOMIC

介绍几种大型的Oracle/SQL Server数据库免费版

介绍几种大型的Oracle/SQL Server数据库免费版 我们知道,Oracle和SQL Server等大型数据库也都存在一些免费的版本,这些免费的版本已经能够满足许多中小项目的需求.对于在校大学生来说,从学习的目标上来讲,安装免费版的大型数据库也就足够用了,而且还不会花费个人计算机过多的资源,可谓一举两得.本文我们介绍了几种免费的大型数据库,接下来我们就开始介绍. 一.Oracle Database 10g Express Edition 简称Oracle 10g迅捷版(XE版),是一款基