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
!
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平台被编译和执行过。