这个参数指向一个UDF_ARGS 成员,其结构如下: unsigned int arg_count 参数个数。如果函数有固定数量的参数,在初始化函数中检查这个值。例如: if (args->arg_count != 1) { strcpy(message," func() requires one arguments"); return 1; } enum Item_result *arg_type 每个参数的类型。可能的类型值是STRING_RESULT、INT_RESULT 和 REAL_RESULT; 确保参数是所需类型,如果不是,返回错误; 在初始化函数中检查arg_type 数组。例如: if (args->arg_type[0] != STRING_RESULT && args->arg_type[1] != INT_RESULT) { strcpy(message," func() requires a string and an integer"); return 1; } 说明 也可以使用初始化函数把arg_type 成员设置成所需类型。这样GBase 为每个func()调用强 GBase 8a MPP Cluster 产品手册 5 数据库管理指南 文档版本953(2022-09-15) 南大通用数据技术股份有限公司 1387 制将参数转换成所需类型。 例如, 为了指定前两个参数是字符串和整数, 可以在func_init() 中这样做: args->arg_type[0] = STRING_RESULT; args->arg_type[1] = INT_RESULT; char **args args 将函数的参数传递给初始化函数和主函数。 函数引用第i 个参数的方式如下: 一个STRING_RESULT 类型的参数由一个字符串指针加一个长度给出, 允许 处理任意的长度的数据; 字符串内容可由args->args[i]得到并且字符串长度是args->lengths[i]。不用考 虑字符串是否以空(null)结束; 对于一个INT_RESULT 类型的参数,必须强制转换args->args[i]为一个long long 值: long long int_val; int_val = *((long long*) args->args[i]); 对一个REAL_RESULT 类型的参数, 必须强制转换args->args[i]为一个double 值: double real_val; real_val = *((double*) args->args[i]); 对一个DECIMAL_RESULT 类型的参数,处理方式同STRING_RESULT 一 样。 unsigned long *lengths 在初始化函数中,lengths 数组指出每个参数的最大字符串长度。 对于主函数调用,lengths 为当前正在处理的行的任何字符串参数的实际长 度。 对INT_RESULT 或REAL_RESULT 类型的参数,lengths 仍然包含参数的最 大长度。 GBase 8a MPP Cluster 产品手册 5 数据库管理指南 文档版本953(2022-09-15) 南大通用数据技术股份有限公司 1388 char *maybe_null 在初始化函数中,maybe_null 指出每个参数是否允许为空(NULL)。 说明 1 表示允许,0 表示不允许。 char **attributes 每个参数的别名,如果不存在别名,就是参数实际名称,如下示例: select 1 from t1 group by udf_func(1+2);则args->attributes[0]为”1+2”,select 1+2 as plus from t1 group by udf_func(plus);则args->attributes[0]为“plus”。 unsigned long *attribute_lengths 每个attributes 的长度。