我目前正在实现一个C表UDF,我想利用SQLUDF_CALL_T(它包含在SQLUDF_TRAIL_ARGS中)和结构dbinfo。这可能吗?
如果是,该怎么做?我之所以问这个问题,是因为当我将这两个结构体都作为参数时,它们都没有返回合理的值。
谢谢你,尼克
注::我可以提供更多的信息/样例代码,如果需要
既然是我自己想出来的,我就在下面给出答案:
将DBINFO
和SQLUDF_TRAIL_ARGS
提供给C UDF的正确方法是将它们定义为C UDF的参数。例如,如果您用C代码(假设是sample_c_udf
)编写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的Documentation, dbinfo
应该总是在参数列表中的SQLUDF_TRAIL_ARGS_ALL
之后。
在键入UDF的代码之后,您可以通过执行类似于以下的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
指示符,否则您的UDF将无法工作。
谢谢。