db2外部函数以SQL0444N结尾,原因码6,SQLSTATE 42724

时间:2019-04-27 10:13:32

标签: db2 db2-luw

我将为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

(对不起,我不知道如何将错误输出更改为英语)

我做错了什么?

1 个答案:

答案 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 ...