您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页MYSQL用户定义函数(UDF)

MYSQL用户定义函数(UDF)

来源:爱go旅游网



这里解释什么是用户定义函数(UDF),是做什么的和怎样使用
1)用户定义函数(UDF)是什么?
基本用户定义函数是一类代码,对MYSQL服务器功能进行扩充,通过添加新函数,性质就象使用本地MYSQL函数abs()或concat().UDF是用C(或C++)写的。也许还可以用BASIC,.NET或其它什么虽然我还没见过有人这么做。
2)为什么和怎样使用UDF功能?
从字面上何以知道UDF是很有用的,尤其当你需要扩展MYSQL服务器功能时。下表给出了最佳解决方法的比较:

Method                                Speed            Language                Development
 方法                                     速度             语言                    开发
Stored Procedures           slow                 SQL              ~minutes (for small functions)
 存储过程                             慢                   SQL              ~分钟(对于小函数)
UDF                                      fast                  C               ~hour
 UDF                                     快                    C               ~小时
Native Function                  fast                  C                major pain in the ***
本地函数                              快                    C                 未知


 
现在我必须决定我们需要哪类函数。本质上有两种选择:
该函数是聚合函数吗?(后面我们将学习很多关于聚合函数的内容)
返回类型是什么?有4个选择:
类型                         描述
STRING             一个合法的字符串,转换成char*类型
INTEGER              一个普通的整型变量,转换成位的整型
REAL型             一个俘点数,转换成double型
DECIAML型          这个并没真正的结束,MYSQL将做字符串对待

 
现在开始讨论关于非聚合函数。必须声明并执行一些MYSQL使用UDF时用到的函数,但首先一些必要的结构必须并确:
UDF_INIT:
类型                           名称                          描述
<code>
my_bool                  maybe_null             是1如果函数能返回NULL
unsigned int          decimals                  针对REAL函数
unsigned long       max_length             针对字符串函数
char *                      ptr                              自由指针针对函数的数据
my_bool                 const_item              0如果结果是的

UDF_ARGS:
类型                                     名称                              描述
unsigned int                       arg_count                成员数量
enum Item_result *          arg_type                   成员类型的数组
char **                                 args                          指向成员的指针的数组
unsigned long *                lengths                    成员长度的数组(针对字符串)
char *                                  maybe_null               "maybe_null"标记的数组
char **                                attributes                  指向成员属性的指针的数组
unsigned long *               attribute_lengths        属性长度数组


现在看一下该函数:
De-/Initialization:

 Collapseextern "C" my_bool MyTest_init(UDF_INIT *initid, UDF_ARGS *args,
                               char *message)
{
   
        //非常重要的一件事是建立内存
        //你需要
        //我们需要一个很长的变量来保存检测数
        //虽然该例中我们不需要
        longlong* i = new longlong; // 建立变量
        *i = 0;                     // 设初值
       
     
        //指针变量中保存为一个字符指针
        //确认你不会遇到类型问题
        initid->ptr = (char*)i;
       

        //检测成员的格式
        if (args->arg_count != 1)
        {
            strcpy(message,"MyTest() requires one arguments");
            return 1;
        }

        if (args->arg_type[0] != INT_RESULT)
        {
            strcpy(message,"MyTest() requires an integer");
            return 1;
        }      
        return 0;           
}

extern "C" void MyTest_deinit(UDF_INIT *initid)
{
    
        //这里必须清空所分配的内存
        //引入函数
        delete (longlong*)initid->ptr;
}

The actual function:

void MyTest_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
{
      
        //为每列将当前值添加到总数
        *((longlong*)initid->ptr) = *((longlong*)initid->ptr) +
                                    *((longlong*)args->args[0]);
}

longlong MyTest(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
{
      
        //最后返回总值
        return *((longlong*)initid->ptr);
}


7)一些指导方针:
如果你确实希望你的UDF运行良好,这里有一些建议:)
不要在UDF中调用任何其他的程序或进程
不要保存任何的本地信息。(这些在普通的库里已经共享)
不要分配任何的全局或静态的变量。
始终检测成员的类型。就象MYSQL将所有类型都转换为字符类型。如果你将一个字符类型转换成整型指针可能会出错。
特别注意内存的分配。如果你有内存泄漏问题你会使服务器彻底崩溃!


8)调式UDF
调试UDF需要勇气因为如果UDF有问题,每次都会使整个MYSQL服务器死掉。所以我写了一个命令行工具,来围绕这个问题工作。仅仅运行它,它会模仿"SELECT"调用指令将结果保存到库文件中,可以打印所有的结果行。所以当UDF存在一些错误只是该程序崩溃而不会是整个服务器。 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务