目录
一、 前言
DB2 自带了一些函数,但有时自带函数并不能满足一些特殊的需求,这时候需要自定义函数来满足特殊的需求,如 MD5 加密函数,在 oracle 中自带,但是在 db2 中却不存在,由于在 CDC 支持 blu 中会用到 md5 加密函数,这时就需要来自定义 md5 函数了。本文通过小例子介绍,夸夸其谈的介绍往往没有一个简单的例子具有说服力,小例子容易理解且上手快。
二、 自定义函数的方法
1. 直接利用 SQL 语句创建自定义函数。
2. 利用 java 类程序创建自定义函数
3. 利用 c 语言创建自定义函数。
针对利用 sql 语句创建函数,网上有很多介绍,能利用 db2 现有的函数和 sql 构建自己的函数,但是有时候 sql 语句也不能创建出满足我们需求的函数,那么就考虑第 2 种和第 3 种方法吧, java 的网上的介绍也很多,本文就不介绍了,而 C 语言创建自定义函数介绍的相关文章很少,且不够细致,尤其当 db2 版本是 windows 的版本的时候。
三、 编写程序
要求 1 :包含头文件 #include <sqludf.h>
要求 2 :参数 , 如一个入参一个出参
void RDIMD5HASH( char *inputParam, char *outParam )
{
MD5_CTX mdContext;
int start = 0;
int interval = 32;
int len = strlen(inputParam);
int i;
MD5Init (&mdContext);
while ( start < len) {
interval = (start + interval) < len ? interval : (len - start);
MD5Update (&mdContext, inputParam + start, interval);
start += interval;
}
MD5Final (&mdContext);
for (i = 0; i < 16; i++){
sprintf (outParam+i*2, "%02x", mdContext.digest[i]);
}
outParam[32] = 0;
return;
}
四、 编译
这一步至关重要,直接决定是否能够提供可用的动态链接库文件
在 Linux 下编译 ( 编译后的文件为 RDIMD5HASH )
- 安装 gcc 编译环境,利用 db2inst1 用户执行如下命令
gcc -o RDIMD5HASH -shared -fPIC -I ~/sqllib/include RDIMD5HASH.c
- 将编译后的文件 RDIMD5HASH 拷贝到 拷贝到 ~sqllib/function/
在 windows 下编译:(编译后的文件为 RDIMD5HASH .dll ) , 系统管理员进行如下操作
- 安装 vs2008 ,注意:系统为 64 位,那么一定要配置 vs2008 的 64 位编译环境 ( 如何配置网上有很多介绍 ) ,因为 64 位系统只能加载 64 位的 dll 文件。
- 这里系统是 64 位,将如下命令,粘贴到一个批处理中
@echo off
rem Set the DB2PATH variable to your DB2 base path, e.g., c:\sqllib
rem Set APRINC to your APR include directory
rem Set APRLIB to your APR library directory
set DB2PATH=c:\opt\IBM\sqllib
set APRINC=C:\opt\IBM\SQLLIB\INCLUDE;C:\vs2008\VC\include
set APRLIB=C:\opt\IBM\SQLLIB\LIB;C:\vs2008\VC\lib\amd64;"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib\x64"
cl -Od /nologo /c /I %APRINC% /D x64 RDIMD5HASH.c
link /libpath:%APRLIB% /subsystem:console /incremental:no /out:RDIMD5HASH.dll /dll /def:RDIMD5HASH.def RDIMD5HASH.obj db2api.lib kernel32.lib user32.lib
copy RDIMD5HASH.dll "%DB2PATH%\FUNCTION" /y
@echo on
- 将如下内容加到 RDIMD5HASH.def 中
LIBRARY "RDIMD5HASH"
EXPORTS
RDIMD5HASH
- 将 APRINC 和 APRLIB 的路径也分别加入到环境变量 INCLUDE 和 LIB 中。
- 执行批处理进行编译 dll 文件并拷贝。
五、 创建函数
连接数据库后创建函数, ( 具体每项的意义这里不做介绍,网上很多介绍 ) ,
db2 "CREATE OR REPLACE FUNCTION RDIMD5HASH(VARCHAR(400))
RETURNS VARCHAR(32)
EXTERNAL NAME 'RDIMD5HASH!RDIMD5HASH'
LANGUAGE C
NULL CALL
PARAMETER STYLE DB2SQL
NO SQL
DETERMINISTIC
NO EXTERNAL ACTION
NOT FENCED"
只说明 'RDIMD5HASH!RDIMD5HASH' , 感叹号前边是文件名 (windows 下也不需要写 .dll) ,感叹号后边是 .c 文件中的函数名
六、 测试
七、 总结
- C /C++,Java 提供了更为灵活的语法,可以替代 SQL 不能完成的工作 。
- C /C++,Java 自定义函数需要 DB2 INST1 数据库管理员权限去创建,创建后给不同的数据库用户进行赋权操作
注: RDIMD5HASH.c 是实现 md5 函数加密,有需要 .c 源文件的联系 jiwla@yonyou.com
Attachments:
DB2自定义函数.docx (application/vnd.openxmlformats-officedocument.wordprocessingml.document)
DB2自定义函数.docx (application/vnd.openxmlformats-officedocument.wordprocessingml.document)