目录
一、
前言
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
要求
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