分析db2与oracle的差别

       开发了一段时间的一个系统一直在db2上使用,终于开发的差不多,测试没什么大问题了。突然有一个客户现场要求用oracle数据库,刚开始觉得应该没什么问题,开发的时候虽然没在oracle数据库测试过,但是无非也就是一些SQL的问题,结果用oracle数据库一发布就傻眼了,我嘞个去竟然没有一个功能能正常运行,所有的功能进去都是空白页面,当然报错的都是SQL,但是这也太超乎我的想象了啊!所以还是记录下遇到的问题吧,以后写SQL的时候还是尽量通用,省的以后移植的时候费那么大劲了。     
    1、取得系统当前日期。db2为current date 但是这个在oracle中是不适用的,oracle为sysdate。我查找资料都没有说明db2可不可以用sysdate,但是我的db2  9.7的版本的确可以用sysdate这个函数的。所以就ok了,所有的取得系统当前日期函数都改为sysdate,适用oracle和db2。    
    2、日期类型字段。对于数据类型为date的字段,在db2中操作的时候不用做任何处理,可以当varchar类型的字段一样处理。但是oracle就不能这么干了,在查询的时候必须用T0_CHAR(CLOMUN,'yyyy-mm-dd'),在update或者insert的时候必须用TO_DATE(CLOMUN,'yyyy-mm-dd')转为DATE类型。在db2中也可以用to_char和to_date函数。     
    3、db2中的DECIMAL和oracle中的NUMBER类型。db2中的DECIMAL对应oracle中的NUMBER类型,来定义数字类型和保留几位有效数字。例如:oracle中定义number(16,2)(四舍五入)  db2中定义decimal(16,2)(会直接截取)。对于DECIMAL类型是不能把空值放进去的,如果为空则默认插入0,而且如果为10.00查询后是可以直接显示的,但是number类型就只显示10所以如果要显示10.00就需要对其进行格式化。另外number类型中是可以放空值的。       
    4、SQL的区别。db2和oracle中有一些SQL的区别,这个都是必然的,但是大部分的简单SQL都还是一样的,这里列举一些吧:
查询序列
oracle:
select T18_ONLINE_TASKFACT_TASKKEY.currval  from dual(当前值)      
select T18_ONLINE_TASKFACT_TASKKEY.nextval  from dual(下一个值)
db2  
select PREVVAL  FOR T18_ONLINE_TASKFACT_TASKKEY from sysibm.sysdummy1  (当前值)             
select NEXTVAL FOR T18_ONLINE_TASKFACT_TASKKEY from sysibm.sysdummy1(下一个值)

查询前10行数据
db2   :       select * from test fetch first 10 rows only
oracle:     select * from test where rownum<=10  

你可能感兴趣的:(db2 oracle)