广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中怎么编写UDF
  • 358
分享到

MySQL中怎么编写UDF

2024-04-02 19:04:59 358人浏览 泡泡鱼
摘要

Mysql中怎么编写UDF,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 1.什么是UDF UDF顾名思义,就是User defined

Mysql中怎么编写UDF,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1.什么是UDF

UDF顾名思义,就是User defined Function,用户定义函数。我们知道,mysql本身支持很多内建的函数,此外还可以通过创建存储方法来定义函数。UDF为用户提供了一种更高效的方式来创建函数。

UDF与普通函数类似,有参数,也有输出。分为两种类型:单次调用型和聚集函数。前者能够针对每一行数据进行处理,后者则用于处理Group By这样的情况。

2.为什么用UDF

既然Mysql本身提供了大量的函数,并且也支持定义函数,为什么我们还需要UDF呢?这主要基于以下几点:

1)UDF的兼容性很好,这得益于MySQL的UDF基本上没有变动

2)比存储方法具有更高的执行效率,并支持聚集函数

3)相比修改代码增加函数,更加方便简单

当然UDF也是有缺点的,这是因为UDF也处于mysqld的内存空间中,不谨慎的内存使用很容易导致mysqld crash掉。

3.如何编写UDF

UDF的api包括

name_init():

在执行SQL之前会被调用,主要做一些初始化的工作,比如分配后续用到的内存、初始化变量、检查参数是否合法等。

name_deinit()

在执行完SQL后调用,大多用于内存清理等工作。init和deinit这两个函数都是可选的

name()

UDF的主要处理函数,当为单次调用型时,可以处理每一行的数据;当为聚集函数时,则返回Group by后的聚集结果。

name_add()

在每个分组中每行调用

name_clear()

在每个分组之后调用

为了便于理解,这里给出两种UDF类型的API调用图:

下面将就上述几个API进行详细的讲解:

1). name_init

原型:

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

UDF_INIT结构体如下:

UDF_ARGS结构体如下:

Message:用于打印错误信息,该指针本身提供长度为MYSQL_ERRMSG_SIZE,来存储信息;

2).name_deinit

原型:

void name_deinit(UDF_INIT*initid)

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

3).name()

原型:针对不同的返回值类型,有不同的函数原型:

当返回值为STRING类型时,参数result开辟一个buffer来存储返回值,但不超过766字节,在length参数中存储了字符串的长度。

每个函数原型还包括了is_null和error参数,当*is_null被设置为1时,返回值为NULL,设置*error为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会被反复调用。

4. 两个例子

下面将举两个简单的例子,一个单次调用型函数,一个聚集类型函数,来描述写一个UDF的过程。

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)接受一个浮点数类型的参数,并对每个分组进行求和

//初始化 

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={安装目录} –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权限

看完上述内容,你们掌握MySQL中怎么编写UDF的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网数据库频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中怎么编写UDF

本文链接: https://www.lsjlt.com/news/56873.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中怎么编写UDF
    MySQL中怎么编写UDF,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 1.什么是UDF UDF顾名思义,就是User defined ...
    99+
    2022-10-18
  • 怎么编写UDF函数
    本篇内容主要讲解“怎么编写UDF函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么编写UDF函数”吧!1.为什么需要UDF?1)、因为内部函数没法满足需求。2)、hive它本身就是一个灵活框...
    99+
    2023-06-02
  • Hive中如何配置与编写自定义UDF函数
    小编给大家分享一下Hive中如何配置与编写自定义UDF函数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!环境介绍:CentOS7+hive-1.1.0-cdh6....
    99+
    2023-06-03
  • Hive中怎么利用UDF实现文本分词
    Hive中怎么利用UDF实现文本分词,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。UDF 简介Hive作为一个sql查询引擎,自带了一些基本的...
    99+
    2022-10-18
  • 怎么编写高效的MySQL应用
    这篇文章主要介绍“怎么编写高效的MySQL应用”,在日常操作中,相信很多人在怎么编写高效的MySQL应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么编写高效的MySQL...
    99+
    2022-10-18
  • mysql中动态语句编写的引号怎么用
    这篇文章主要为大家展示了“mysql中动态语句编写的引号怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql中动态语句编写的引号怎么用”这篇文章吧。 ...
    99+
    2022-10-18
  • mysql设置编码的命令怎么写
    这篇文章将为大家详细讲解有关mysql设置编码的命令怎么写,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql设置编码的命令是:【SET character_set_...
    99+
    2022-10-18
  • MySQL中如何编写daemon plugin
    这篇文章给大家介绍MySQL中如何编写daemon plugin,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 1.什么是DaemonPlugin 顾名思义,daemon plug...
    99+
    2022-10-18
  • MySQL数据库巡检脚本怎么编写
    MySQL数据库巡检脚本怎么编写,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。概述分享一个我平时用来做MySQLl数据库巡检的脚本,该脚本主要...
    99+
    2022-10-19
  • 怎么使用Golang编写MySQL应用程序
    本篇内容介绍了“怎么使用Golang编写MySQL应用程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!步骤一:安装和设置MySQL数据库首...
    99+
    2023-07-05
  • 怎么使用Golang编写MySQL存储过程
    本文小编为大家详细介绍“怎么使用Golang编写MySQL存储过程”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Golang编写MySQL存储过程”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、为什么...
    99+
    2023-07-06
  • mysql中if语句怎么写
    这篇文章将为大家详细讲解有关mysql中if语句怎么写,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。mysql中if语句怎么写1、IF表达式 IF(c...
    99+
    2022-10-18
  • mysql中外连接怎么写
    小编给大家分享一下mysql中外连接怎么写,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql中外连接可以分为左外连接和右外...
    99+
    2022-10-18
  • golang怎么编写
    Golang是一种新兴的开发语言,也称为Go编程语言。它是Google设计的一种语言,旨在提高编写可扩展,高性能和分布式软件的效率。Golang的设计目标是简单,直接和易于使用。在本文中,我们将详细介绍如何编写Golang。安装Golang...
    99+
    2023-05-14
  • MySQL中如何编写Information Schema Plugin
    MySQL中如何编写Information Schema Plugin,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 1. 什么是i_s p...
    99+
    2022-10-18
  • centos中怎么编写shell脚本
    在CentOS中编写Shell脚本主要有以下几个步骤: 打开终端,创建一个新文件,例如script.sh,可以使用touch s...
    99+
    2023-10-23
    centos shell
  • 怎么在CSS中编写注释
    这篇文章主要介绍“怎么在CSS中编写注释”,在日常操作中,相信很多人在怎么在CSS中编写注释问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么在CSS中编写注释”的疑惑有所帮...
    99+
    2022-10-19
  • Delphi中怎么编写VB控件
    在Delphi中编写VB控件,可以按照以下步骤进行:1. 打开Delphi IDE,创建一个新的Delphi项目。2. 在项目中创建...
    99+
    2023-10-12
    Delphi VB
  • 怎么在Bash中编写循环
    本篇文章给大家分享的是有关怎么在Bash中编写循环,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。使用for循环和find命令自动对多个文件执行一组操作。人们想要学习Unix s...
    99+
    2023-06-28
  • 怎么在Bash中编写函数
    这篇文章给大家分享的是有关怎么在Bash中编写函数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。通过编写函数来减少代码的冗余和维护。在编程时,实际上是在定义要由计算机执行的过程procedure或例程routin...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作