DB2 Table C UDF DBINFO and SQLUDF_TRAIL_ARGS



我目前正在实现一个C表UDF,我想利用SQLUDF_CALL_T(它包含在SQLUDF_TRAIL_ARGS中)和结构dbinfo。这可能吗?

如果是,该怎么做?我之所以问这个问题,是因为当我将这两个结构体都作为参数时,它们都没有返回合理的值。

谢谢你,尼克

注::我可以提供更多的信息/样例代码,如果需要

既然是我自己想出来的,我就在下面给出答案:

DBINFOSQLUDF_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_ALLdbinfo的顺序很重要。根据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将无法工作。

谢谢。

最新更新