DB2表C UDF DBINFO和SQLUDF_TRAIL_ARGS

时间:2014-06-04 00:15:26

标签: c db2

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

如果是,怎么办呢?我问,因为当我将两个结构都包含为参数时,它们都不会返回合理的值。

谢谢你, 尼克

P.S。:如果需要,我可以提供更多信息/示例代码。

1 个答案:

答案 0 :(得分:0)

自从我自己想出来之后,我将提供以下答案:

向C UDF提供bot DBINFOSQLUDF_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_ALLdbinfo的顺序很重要。根据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无法正常工作。

谢谢。