1. UDF概念
UDF就是user define function。在mysql内部,提供了很多内建函数,如 abs()、count()等,但根据实际情况,内建的函数并不一定能满足我们的需要,这时就可以使用mysql提供的udf了,构建我们自己的函数,然后加到mysql中。如其他函数一样,udf有参数,也有输出,udf函数类型有两类:单一函数如abs(),聚集函数如count()、sum()等,创建udf函数使用的语言是C/C++。
2. UDF API介绍
在编写udf的过程中,有几个重要api,也是固定流程,以下将介绍各个api以及编写过程中的注意事项。
2.1. 初始化函数
函数原型:my_bool name_init(UDF_INIT *inited, UDF_ARGS *args, char*message)
该函数在sql语句之前执行,做一些初始化的工作,如参数类型检查,参数个数判断,内存分配,同时在该函数中还可以做参数类型的强制转换,name表示实际要取的函数名字。
参数介绍:
UDF_INIT:
参数名称 |
参数类型 |
说明 |
maybe_null |
my_bool |
如果为1,表示udf可以返回NULL |
decimals |
unsigned int |
若返回值是实数,表示精度,范围0—30 |
max_length |
unsigned long |
返回值最大允许的长度 |
ptr |
char* |
参数指针,可以自定义分配内存,并传给其他api使用 |
const_item |
my_bool |
为1表示函数总是返回相同的值 |
extension |
void* |
用于扩展 |
UDF_ARGS:
参数名称 |
参数类型 |
说明 |
arg_count |
unsigned int |
参数个数 |
arg_type |
enum Item_result* |
参数类型数组,记录每一个参数的类型,枚举值有:STRING_RESULT、DECIMAL_RESULT、REAL_RESULT、INT_RESULT |
args |
char** |
存储sql语句执行后返回的结果,对于STRING_RESULT、DECIMAL_RESULT是char*,INT_RESULT是long long*,REAL_RESULT是double*,也可能是NULL指针 |
maybe_null |
char* |
该数组表示每个参数是否可以为空 |
lengths |
unsigned int* |
存储每个参数的长度 |
attributes |
char** |
存储每个参数的名字 |
attribute_lengths |
unsigned long* |
存储每个参数名字的长度 |
ex |