技术开发 频道

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

  IBM的基本的数据类型包括CHAR()、VarChar()、SMALLINT、INTEGER、BIGINT、DECIMAL、REAL、DOUBLE、DATE、TIME、TIMESTAMP数据类型,DECODE的函数的条件值和判断值的数据类型一致,但返回数据类型可以和条件值不同,按照排列组合的规律来看,输入、输出数据类型的组合式11n,当N>3以上,由于代础最和组合次数过多,很难采用手工写程序的方式来实现。

  为丁解决这个难题,我们想到了采用代码生成机来实现所有的组合,考虑到使用的方便和跨平台,采用JAVA程序开发GenDecode的生成程序,具体执行过程中只需输入预计最大的DECODE的参数数量,GenDecode按照数据组合的顺序,逐步把所有的参数类犁的组合全部生成出来,并且导入到文件中,以下是GenDecode的主要功能函数:

// 根据给定的参数值,生成各种组合的 DECODE 函数
private void GenDecode(
int intMaxInputNumber) {
String strFlagType
= "";
String strReturnType
= "";
String strBuffer
= "";
//DB2 数据类型
String
[] strType = new String[11];
strType
[0] = "CHAR(128)";
strType
[1] = "VarChar(512)";
strType
[2] = "SMALLINT";
strType
[3] = "INTEGER";
strType
[4] = "BIGINT";
strType
[5] = "DECIMAL";
strType
[6] = "REAL";
strType
[7] = "DOUBLE";
strType
[8] = "DATE";
strType
[9] = "TIME";
strType
[10] = "TIMESTAMP";
int m = 0, n = 0, intMax = 3;
while (intMax <= intMaxInputNumber) {
m
= 0;
n
= 0;
while (m < 11) {
n
= 0;
strFlagType
= strType[m];
while (n < 11) {
strReturnType
= strType[n];
// 生产 DB2 UDF DECODE 的函数头
strBuffer
+= GenInputVal(intMax, strFlagType, strReturnType);
// 生成 DB2 UDF DECODE 的函数体
strBuffer
+= GenWhenElse(intMax);
// 把生产的代码写入文件
WrtDecode(strBuffer);
strBuffer
= "";
n
++;
}
m
++;
}
intMax
++;
}
}
通过GenDecode生产的DECODE函数的例子,在下载中您可以下载已经生成1到35个参数的DECODE函数,见下载章节中的DECODE.SQL函数。

CREATE FUNCTION DECODE(P0 SMALLINT,P1 SMALLINT,
P2 TIME,P3
SMALLINT,P4 TIME)
RETURNS TIME
LANGUAGE SQL
BEGIN ATOMIC
RETURN
(
CASE P0
WHEN P1 THEN P2
WHEN P3 THEN P4
END
);
END
!

  总 结

  本文展示了一些SQL开发的用户定义函数(UDF)以实现ORACLE中的若干关键性函数。如果你对确切的实现细节很感兴趣,可以查阅这些代码。一旦变异?并连接了源代码(或安装了预编译的库)以及在数据库中注册了这些过程和函数之后,就可以按本文示例所演示的那样来使用它们了。另外值得注意的是,这些过程和函数已经在DB2 UDB v9.1平台被编译和执行过。

1
相关文章