我将为DB2开发新的(外部)功能。我的第一个测试:
db2crypt.h
#ifndef DB2CRYPT_H
#define DB2CRYPT_H
#include <string.h>
#include <stdlib.h>
char *encryptAes(const char *source, const char *key);
#endif /* DB2CRYPT_H */
db2crypt.cpp
#include "db2crypt.h"
#include <string>
char *encryptAes(const char *source, const char *key) {
std::string test("abc");
return (char *)test.c_str();
}
编译没有错误。
g++ -fPIC -c db2crypt.cpp -std=c++14
g++ -shared -o db2crypt db2crypt.o -L$DB2PATH -ldb2
我还将新文件复制到$ DB2PATH / function中,并在$ DB2PATH / function / unfenced中建立了软链接。
然后我用
创建了函数create function aes(VARCHAR(4096), VARCHAR(4096))
SPECIFIC encryptAes
RETURNS VARCHAR(4069)
NOT FENCED
DETERMINISTIC
NO SQL
NO EXTERNAL ACTION
LANGUAGE C
RETURNS NULL ON NULL
INPUT PARAMETER STYLE SQL
EXTERNAL NAME "db2crypt!encryptAes"
也可以。
但是当我做select db2inst1.aes('a', 'b') from SYSIBM.SYSDUMMY1
时
我得到了错误
SQL0444N Die Routine "DB2INST1.AES" (spezifischer Name "ENCRYPTAES") ist
durch Code in Bibliothek oder Pfad ".../sqllib/function/db2crypt", Funktion
"encryptAes" implementiert, auf die kein Zugriff möglich ist. Ursachencode:
"6". SQLSTATE=42724
(对不起,我不知道如何将错误输出更改为英语)
我做错了什么?
答案 0 :(得分:0)
好,我知道了。 谢谢@mao,您确实帮助了我。但是我还需要其他帮助。如果有人搜索答案:
首先,您必须编译一些重要参数:
g++ -m64 -fPIC -c <yourfile>.cpp -std=c++14 -I/opt/ibm/db2/V11.1/include/ -D_REENTRANT
g++ -m64 -shared -o <yourfile> <yourfile>.o -L$DB2PATH -ldb2 -Wl,-rpath,$DB2PATH/$LIB -lpthread
第二:函数声明,还必须为空值添加参数,并且返回值不能是函数返回,而必须是参数。另外,您还必须使用sqludf.h中定义的类型:
void SQL_API_FN encryptAes(SQLUDF_CHAR *source,
SQLUDF_CHAR *key,
SQLUDF_CHAR out[4096],
SQLUDF_SMALLINT *sourcenull,
SQLUDF_SMALLINT *keynull,
SQLUDF_SMALLINT *outnull,
SQLUDF_TRAIL_ARGS) {
...
}
另外,当您使用C ++而不是C时,必须告诉脚本它必须将函数作为C处理:
#ifdef __cplusplus
extern "C"
#endif
void SQL_API_FN ...