mysql udf c 示例_MySQL 数据库用户自定义函数UDF的API介绍和UDF开发示例 | IT工程师的生活足迹...

本文介绍了MySQL数据库中用户自定义函数(UDF)的API接口,包括name_init、name_deinit、name()、name_add和name_clear等,并通过两个示例详细讲解了如何使用C语言编写单次调用型和聚集类型函数,涉及参数检查、内存管理和返回值处理。
摘要由CSDN通过智能技术生成

一、UDF 自定义函数API接口说明

MySQL 数据库UDF用户自定义开发函数的API接口说明如下:

1.1、name_init

my_boolname_init(UDF_INIT *initid, UDF_ARGS *args, char *message)

请自行了解UDF_INIT 结构体和UDF_ARGS结构体

Message:用于打印错误信息

1.2、name_deinit

void name_deinit(UDF_INIT*initid)

该函数会进行一些内存释放和清理的工作,在之前我们提到initid->ptr,我们可以在该区域·进行内存的动态分配,这里就可以直接进行内存释放。

1.3、name()

针对不同的返回值类型,如:STRING\DECIMAL\INTEGER\REAL

1.4、name_add()和name_clear()

void name_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null,char *error)

void name_clear(UDF_INIT *initid, char *is_null, char *error)

对于聚合类型的UDF,name_addd和name_clear会被反复调用

二、两个示例

下一个单次调用型函数,一个聚集类型函数,来描述写一个UDF的过程。

2.1、示例一

接受一个参数,并返回该参数的值

//初始化

my_booludf_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message)

{

if (args->arg_count != 1){ //检查参数个数

strcpy(message, "udf_intexample() can onlyaccept one argument");

return 1;

}

if (args->arg_type[0] != INT_RESULT){ //检查参数类型

strcpy(message, "udf_intexample() argumenthas to be an integer");

return 1;

}

return 0;

}

//清理操作

voidudf_int_deinit(UDF_INIT *initid)

{

}

//主函数

long long udf_int(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)

{

long long num = (*(long long *)args->args[0]); //获取第一个参数值

return num;

}

2.2、示例二

接受一个浮点数类型的参数,并对每个分组进行求和

//初始化

my_booludf_floatsum_init(UDF_INIT *initid, UDF_ARGS *args, char *message)

{

double *total = (double *) malloc (sizeof(double));

if (total == NULL){ //内存分配失败

strcpy(message,"udf_floatsum:alloc mem failed!");

return 1;

}

*total = 0;

initid->ptr = (char *)total;

if (args->arg_count != 1){ //检查参数个数

strcpy(message, "too moreargs,only one!");

return 1;

}

if (args->arg_type[0] != REAL_RESULT){ //检查参数类型

strcpy(message, "wrongtype");

return 1;

}

initid->decimals = 3; //设置返回值精度

return 0;

}

//清理、释放在init函数中分配的内存

voidudf_floatsum_deinit(UDF_INIT *initid)

{

free(initid->ptr);

}

//每一行都会调用到该函数

voidudf_floatsum_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)

{

double* float_total;

float_total = (double*)initid->ptr;

if (args->args[0])

*float_total += *(double*)args->args[0];

}

//每个分组完成后,返回结果

doubleudf_floatsum(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)

{

double* float_total;

float_total = (double *)initid->ptr;

return *float_total;

}

//在进行下一个分组前调用,设置initid->ptr指向的值为0,以便下一次分组统计

voidudf_floatsum_clear(UDF_INIT *initid, char *is_null, char *error)

{

double *float_total;

float_total = (double *)initid->ptr;

*float_total = 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值