教程学院
图像设计 多媒体类 机械制图 办公软件 操作系统 系统编程 网站编程 网页制作 数据库类 网络路由 网络工程 网络安全 考试认证
firefox火狐浏览器下载
酷网学院
CAD
AutoCad Cam350 ProEngineer GCcam MATLAB Unigraphics SolidWorks CAXA Solid3000 Cimatron EdgeCAM
系统
安全 防火墙 病毒 WinXP Win2003 Vista
数据库
编程
网络
精彩图库
  当前位置: 库库中文网 · 数据库类教程 · MSSQL教程 · MsSql综合技巧

MYSQL用户定义函数(UDF)

学院最新推荐文章
教程推荐
『MYSQL用户定义函数(UDF)』如果文章有大量图片,显示会较慢,请等待图片下载完成
 
点击数: 更新时间:2008-9-20 

UDF资源文件

UDF测试程序

这里解释什么是用户定义函数(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                未知


慢的意思是和其它比较时。存储过程和一般SQL语句比仍然是很快的。
对本地函数的一点解释:本质上和UDF没太大区别。但是你必须用MYSQL的资源代码来写然后重新编译全部。这将是很大的工作量,你必须一边又一边的用最新版的MYSQL来完成这项工作。
3)怎样使用UDF?
这部分很简单。当你完成了一个UDF,你只是使用它就可以了。例如:"SELECT MyFunction(data1, data2) FROM table"
4)编写UDF
现在我们开发写一个UDF:
建立一个新的shared-library项目(该例中我用的VC++ 6.0建立一个标准的DLL)
首先我需要一些头文件。这些头文件是标准的头文件和MYSQL服务器的包含目录里的文件
#ifdef STANDARD
/* STANDARD is defined, don't use any mysql functions */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifdef __WIN__
typedef unsigned __int64 ulonglong;    /* Microsofts 64 bit types */
typedef __int64 longlong;
#else
typedef unsigned long long ulonglong;
typedef long long longlong;
#endif /*__WIN__*/
#else
#include <my_global.h>
#include <my_sys.h>
#endif
#include <mysql.h>
#include <ctype.h>
static pthread_mutex_t LOCK_hostname;



现在我必须决定我们需要哪类函数。本质上有两种选择:
该函数是聚合函数吗?(后面我们将学习很多关于聚合函数的内容)
返回类型是什么?有4个选择:
类型                        描述
STRING            一个合法的字符串,转换成char*类型
INTEGER              一个普通的整型变量,转换成64位的整型
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");
      &nb

[1] [2] 下一页  

作者:diskonli… 来源:C.S.D.N
】【关闭窗口
·上页:
·下页:
相关文章
     数据库类教程 - MsSql综合技巧
普通教程【脑袋快想爆炸了- -!】 怎么样
普通教程关于级联删除地疑难,新手提问,
普通教程怎么样动态控制列数?
普通教程数据库恢复 MS2000
普通教程当数据库中varchar字段值为null
普通教程create function 怎么才无法要返
普通教程各位帮我看看是啥疑难啊, SQL运
普通教程SQL server 2005 安装疑难 SP2更
普通教程sql update
普通教程update触发器地疑难
普通教程字符串地查询疑难
普通教程安全性--登陆--想建一个用户tes
精彩图片汇集
advertisement
关于站点 - 广告服务 - 联系我们 - 版权隐私 - 免责声明 - 合作伙伴 - 程序支持 - 网站地图 - 返回顶部
网站文本地图
版权所有:库库中文 2005-2007 欢迎各种媒体转载我们的原创作品[转载请注明出处]
copyright © 2005-2008 www.QQGB.com online services. all rights reserved. 蜀ICP备05015578
Template designed by Virus. Optimized for 1024x768 to Firefox,Opera and MS-IE6. Site powered by EQL.
红盾
热爱电脑,热爱生活
拥有电脑,拥有生命
让我们享受拥有电脑的时光