中文参考手册---14为MySQL增加新函数

来源:互联网 发布:大数据动画 编辑:程序博客网 时间:2024/06/04 00:31
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

有2种方法把新函数加到MySQL中:你可以通过用户定义函数(UDF)接口加入函数。用户定义函数用语句动态地增加和删除。见7.30句法。你可以加入函数作为一个原生的(内置的)MySQL函数。原生函数被编译进服务器并且在一个永久的基础上可得到。

每种方法都有优点和缺点:如果你编写一个用户定义函数,你必须安装服务器外还得自己安装对象文件。如果你编译函数进服务器中,你不需要那样做。你能把UDF加到MySQL二进制代码发行中。原生函数要求你修改源代码分发。如果你升级你的MySQL分发,你能继续使用你的以前安装的UDF。对于原生函数,你必须在每次升级时重复你的修改。

无论你使用哪种方法增加新函数,他们可以象原生函数例如那样使用。

对于UDF的工作机制,函数必须用C或编写并且你的必须支持动态装载。MySQL源代码分发包括一个文件,它定义了5个新函数。请教这个文件看UDF调用约定怎样工作。

对每一个你想在SQL语句中使用的函数,你应该定义对应的C(或C++)函数。在下面的讨论中,“xxx”用于一个函数名的例子。为了区别SQL和C/C++用法,(大写)表明SQL函数调用,而((小写)表明C/C++函数调用。

你编写实现的接口的C/C++函数是:

(必需的)
主函数。这是计算函数结果的地方。SQL类型于你的C/C++函数返回类型的对应关系如下:SQL类型C/C++类型
(可选)
的初始化函数,它可用于:检查传到的参数数量。检查参数是一种所需的类型,或,另外地,当主函数被调用时,告诉MySQL,为了强制参数到你想要的类型。分配任何由主函数所需的内存。指定结果的最大长度。指定(对函数)小数位的最大数目。指定结果是否能是
(可选)
的结束函数,它应该释放初始化函数分配了的任何内存。

当一条SQL语句调用时,MySQL调用初始化函数,让它执行任何所需的设置,例如参数检查或内存分配。如果返回一个错误,SQL语句用一条错误消息并被放弃而主函数和结束函数不被调用,否则,为每行调用主函数一次。在所有行被处理完后,结束函数被调用,因此它能执行任何必要的清除。

所有函必须是线程的(不只是主函数,还有初始化和结束函数)。这意味着,你不允许分配任何改变的全局或静态变量!如果你需要内存,你应该在种分配它并且在中释放它。

主函数应该如下定义。注意返回类型和参数不同,取决于你是否在语句中声明SQL函数返回

函数:

char*xxx(UDF_INIT*initid,UDF_ARGS*args,char*result,unsignedlong*length,char*is_null,char*error);

函数:

longlongxxx(UDF_INIT*initid,UDF_ARGS*args,char*is_null,char*error);

对于函数:

doublexxx(UDF_INIT*initid,UDF_ARGS*args,char*is_null,char*error);

初始化和结束函数象这样被声明:

my_boolxxx_init(UDF_INIT*initid,UDF_ARGS*args,char*message);voidxxx_deinit(UDF_INIT*initid);

参数被传给所有3个函数,它指向一个结构,被用来在函数之间传递信息。结构成员列在下面。初始化函数应该填写它想要改变的任何成员。(对一个成员使用缺省值,不改变它。)1
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击