技术开发 频道

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

  【IT168 技术】为了使得将数据库和应用程序从Oracle数据库产品迁移到IBM DB2更方便,本文具体探讨在迁移过程中的一些常见问题以及,ORACLE数据库移植到DB2中的变量定义、空值处理、隐形转换、时间函数及DECODE函数的解决。

  变量定义和BEGIN END

  DB2中变量定义在BEGIN END体内,并且每个变量都要用DECLARE声明;存储过程结束时,END后跟P1,并且不需要分号。

  Oracle中变量定义必须在BEGIN END体外,变量都不需要用DECLARE声明(有种说法是,第一个变量需要DECLARE,其他变量不需要);存储过程结束时,END后跟存储过程的名称,并且需要分号。

  DB2:

CREATE PROCEDURE PRO1()
LANGUAGE SQL
P1:
BEGIN
--变量定义
DECLARE INSERT_DATE TIMESTAMP;
DECLARE ALLDEPT_NO VARCHAR(20);
--具体操作
SELECT a FROM TAB_1;
.........
END P1

  Oracle:

CREATE PROCEDURE PRO1
IS
--变量定义
INSERT_DATE TIMESTAMP;
ALLDEPT_NO
VARCHAR(20);
BEGIN
--具体操作
SELECT a FROM TAB_1;
.........
END PRO1;

  空值的处理

  Oracle空值处理通过 nvl 函数实现,DB2中通过COALESCE函数实现。在DB2 V9.5中已经实现了 NVL 函数。

  在Oracle中,对于null数据的处理比较灵活,在与NULL值进行比较和拼接时与DB2的结果完全不同,例如:

  SELECT 'abc' || c1 FROM t1 (c1 IS NULL)

  ORACLE得到 abc 的结果。

  在DB2中为null,要想得到 abc 的结果,按照如下语法修改,

  SELECT 'abc‘ || COALESCE(c1,'') FROM t1

  还有在Oracle中select * from table where id = null这种语法是允许的,在DB2中不可。但需要说明的是在Oracle中虽然select * from table where id = null是可以通过语法检查,但与select * from table where id is null语句得到结果集是不同的,所以在移植时要考虑真实的业务意义,在翻译成DB2的语法。

  另外有些应用有如下用法:

SELECT * FROM TABLE WHERE ('' IS NULL OR ID is null) AND ('' IS NULL OR NAME = '') AND NUM = '0'

  在DB2中可翻译为:

SELECT * FROM TABLE WHERE (cast(null as varchar(10)) IS NULL OR ID is null) AND (cast(null as varchar(10)) IS NULL OR NAME is null) AND NUM = '0'
1
相关文章