我目前正在实现C表UDF,我想使用SQLUDF_CALL_T(它包含在SQLUDF_TRAIL_ARGS中)和结构dbinfo。这可能吗?
如果是,怎么办呢?我问,因为当我将两个结构都包含为参数时,它们都不会返回合理的值。
谢谢你, 尼克
P.S。:如果需要,我可以提供更多信息/示例代码。
答案 0 :(得分:0)
自从我自己想出来之后,我将提供以下答案:
向C UDF提供bot DBINFO
和SQLUDF_TRAIL_ARGS
的正确方法是将它们定义为C UDF的参数。例如,如果您使用C代码编写UDF(让我们说sample_c_udf
),则必须如下所示:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlca.h>
#include <sqludf.h>
#ifdef __cplusplus
extern "C"
#endif
void SQL_API_FN sample_c_udf(
SQLUDF_VARCHAR *input,
SQLUDF_BIGINT *outputVal,
SQLUDF_SMALLINT *inputNullInd,
SQLUDF_SMALLINT *outInd,
SQLUDF_TRAIL_ARGS_ALL,
SQLUDF_DBINFO* dbinfo
)
{
(... your code here...)
}
听起来很奇怪,您定义SQLUDF_TRAIL_ARGS_ALL
和dbinfo
的顺序很重要。根据DB2的文档,dbinfo
应始终位于参数列表中的SQLUDF_TRAIL_ARGS_ALL
之后。
输入您的UDF代码后,您就可以注册&#34;它通过执行类似于以下内容的SQL脚本在您的数据库中执行:
CREATE OR REPLACE FUNCTION sample_c_udf
( INPUT VARCHAR(32) )
RETURNS BIGINT
EXTERNAL NAME 'your_compiled_code_file_name!sample_c_udf'
LANGUAGE C
PARAMETER STYLE DB2SQL
NOT FENCED THREADSAFE
RETURNS NULL ON NULL INPUT
NOT DETERMINISTIC
NO SQL
NO EXTERNAL ACTION
SCRATCHPAD 32000
FINAL CALL
DBINFO
ALLOW PARALLEL;
请记住,要始终定义DBINFO
directiver,否则您的UDF无法正常工作。
谢谢。