知识库 : DB2自定义函数

Edit Document

目录

DB2 自定义函数

一、               前言

二、               自定义函数的方法

三、               编写程序

四、               编译

五、               创建函数

六、               测试

七、               总结

DB2自定义函数

一、     前言

              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 )

  1. 安装 gcc 编译环境,利用 db2inst1 用户执行如下命令

gcc -o RDIMD5HASH -shared -fPIC -I ~/sqllib/include RDIMD5HASH.c

 

  1. 将编译后的文件 RDIMD5HASH 拷贝到 拷贝到 ~sqllib/function/

 

windows 下编译:(编译后的文件为 RDIMD5HASH .dll , 系统管理员进行如下操作

  1. 安装 vs2008 ,注意:系统为 64 位,那么一定要配置 vs2008 64 位编译环境 ( 如何配置网上有很多介绍 ) ,因为 64 位系统只能加载 64 位的 dll 文件。
  2. 这里系统是 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

  1. 将如下内容加到 RDIMD5HASH.def

LIBRARY    "RDIMD5HASH"

EXPORTS

RDIMD5HASH

  1. APRINC APRLIB 的路径也分别加入到环境变量 INCLUDE LIB 中。
  2. 执行批处理进行编译 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 文件中的函数名

六、     测试

 

七、     总结

  1. C /C++,Java 提供了更为灵活的语法,可以替代 SQL 不能完成的工作
  2. 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)
DB2自定义函数.docx (application/vnd.openxmlformats-officedocument.wordprocessingml.document)