设为首页 加入收藏

TOP

MySQL:如何编写UDF(二)
2014-11-24 08:11:57 来源: 作者: 【 】 浏览:1
Tags:MySQL: 如何 编写 UDF
F_ARGS *args, char *is_null, char *error)

{

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

return num;

}

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;

}

3) Mysql-udf-http是一个开源的UDF,可以利用HTTP协议进行REST操作。什么是REST操作呢?REST是一种web service架构风格,其实现基于HTTP协议的四种方法:POST、GET、PUT以及DELETE操作,在mysql-udf-http里分别对应的函数是http_post、http_get()、http_put()、http_delete()。

源码下载:http://curl.haxx.se/download/curl-7.21.1.tar.gz

./configure–prefix={mysql安装目录} –with-mysql=/usr/local/webserver/mysql/bin/mysql_config

Make&& make install

该UDF的实现原理比较简单,主要使用libcurl库函数来实现http协议通信,总共三百多行代码。这里有使用和介绍http://blog.s135.com/mysql-udf-http/

有些比较有趣的功能:

例如,我们可以通过GET方法获取微博中的个人信息,其中1821798401为用户ID

selecthttp_get('http://api.t.sina.com.cn/statuses/user_timeline/1821798401.json count=1&source=1561596835')

UDF具有非常高的自由度,你可以编写你任何想要实现的功能函数,甚至可以引用MySQL内核的代码和变量。

当然,UDF也有着局限性,如下:

a) 在mysql库下必须有func表,并且在 skip grant tables开启的情况下,UDF会被禁止;

b) 当UDF挂掉时,有可能会导致mysqld crash掉;

c) 所有的UDF的函数必须是线程安全的,如果非要用全局变量,需要加互斥,尽量在name_init中分配资源,并在name_deinit中释放

d) 需要有insert权限

作者 zhaiwx1987

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇MySQL字符型数据区分大小写 下一篇MYSQL时间函数用法宝典

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·MySQL 基础入门视频 (2025-12-26 23:20:22)
·小白入门:MySQL超详 (2025-12-26 23:20:19)
·关于 MySQL 数据库学 (2025-12-26 23:20:16)
·SOLVED: Ubuntu 24.0 (2025-12-26 22:51:53)
·Linux 常用命令最全 (2025-12-26 22:51:50)