db2 - db2 外部函数以 SQL0444N 结尾,原因代码 6,SQLSTATE 42724
问题描述
我将为 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
(对不起,我不知道怎么把错误输出改成英文)
我做错了什么?
解决方案
好的,我得到了答案。谢谢@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 ...
推荐阅读
- ruby-on-rails - 头像图像未从 React 客户端传递到 Rails API
- php - 如何在移动设备的重定向页面上传递 PHP 会话值?
- rxjs - API 返回一个我需要解析的数组;每个项目一个请求
- c++ - iter++->empty() 和 ++iter->empty() 有什么区别?
- location - 我有一个只有 x,y 坐标和 x' 和 y 值的数据集通过另一种算法传给我
- php - Wordpress - 如何使用 URL 中的搜索查询参数“标签”注册自定义分类并使其工作?
- node.js - 不确定为什么在使用 express-session 时没有 cookie 被发送回我的 localhost 客户端
- node.js - 在 Node.js 应用程序中格式化 JSON 内容的最佳方式
- javascript - JS 添加活动悬停项目列表
- php - PDO Prepared Statement 未按预期在 MySQL 中创建表