开发了一段时间的一个系统一直在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