技术开发 频道

Oracle向DB2迁移:关键性函数及常见问题

  隐形转换处理

  在程序迁移过程中我们需要注意一点的是:Oracle支持数据类型之间的隐形转化,而DB2是不支持数据这个特性的,因此在使用SQL进行数据查询或更新时必须配置字段的类型。

  例如:在表中employee 字段empno 定义为数字类型:

select * from employee where empno='1010';

  该语句在oracle数据库环境可执行通过,但在DB2下报错:

  SQLCODE: -408, SQLSTATE: 42821。

  修正为:

  select * from employee where empno=1010;

  如果在程序中使用变量,可以使用cast关键字进行数据类型转换工作。语法如下:

  select * from employee where empno =cast(V_name as bigint)

  
select * from employee where empno =cast(V_name as varchar(10))

  以上主要讲了Oracle向DB2迁移的3种常见问题的处理,下面引用 IBM高级工程师 戴慰 的一篇文章《从Oracle数据库移植到 DB2 V9.1 过程中几个关键性函数的实现》的里面的2种常见关键性函数的解决方法。

  日期时间函数的实现

  Oracle采用SYSDATE作为取当前时间,而DB2中采用CURRENTTIMESTAMP获得当前时间,为了减少代码的修改量,我们编写SYSDATE的UDF函数,只需要在SYSDATE后面增加双括号,既然由Oracle中的Sysdate修改成Sysdate(),即可以调用新编写的SYSDATE()函数,见下载章节中的SYSDATE函数。

CREATE FUNCTION sysdate()
RETURNS timestamp
LANGUAGE SQL
BEGIN ATOMIC
RETURN
(
current timestamp
);
END
!

  DECODE函数的实现

  Oracle的Decode是多值判断函数,该函数有Oracle内核进行解析和判断,不属于普通的用户函数,所以DECODE对传入的调制值和返回值都可以动态调用。DECODE函数的应用非常广泛,DECODE(条件值1,返回值1,值2,返回值2,……值n,返回值n,缺省值),该函数的内容逻辑如下:

IF 条件 =1 THEN RETURN( 返回值 1)
IF 条件 =2 THEN RETURN( 返回值 2)
......
IF 条件 = 值 n THEN RETURN( 返回值 n)
ELSE  RETURN( 缺省值 )

  从DECODE函数代码逻辑来看,DECODE的内部的原理非常的简单,难点就是在于如何解决DOUBLE,DATE,TIMESTAMPL等不同的参数数据类型和不同的返回数据类型。由于DECODE是ORACLE数锯库的内部函数,ORACLE内部的实现机制不得而知,如果想在DB2内实现如下功能必须利用UDF的可重载的特性。

1
相关文章