实现UDF的文件必须在运行服务器的主机上编译和安装。这个步骤在下面介绍,以包含在MySQL源码分发版里的UDF文件sql/udf_example.cc 为例。
紧接着下面的指令是对Unix的,对Windows的指令在本节稍后给出。
udf_example.cc 文件包含下列函数:
metaphon() 返回字符串参量的一个变音位(metaphon)字符串,这有点象一个探测法(soundex)字符串,但是它英语更协调。
myfunc_double()返回在其参量中所有字符的ASCII值的和,除以其 参量长度之和。
myfunc_int()返回其参量长度之和。
sequence([const int]) 返回一个序列,从给定数开始,若没有给定数则从1开始。
lookup() 返回对应主机名的IP数。
reverse_lookup() 返回对应一个IP数的主机名。函数可以带'xxx.xxx.xxx.xxx'形式的一个单字符串 参量调用,要么带4个数字调用。
一个可动态加载的文件应使用如下这样的命令编译为一个可共享的对象文件:
shell> gcc -shared -o udf_example.so udf_example.cc
如果你使用gcc,你应该能用一个更简单的命令创建udf_example.so :
shell> make udf_example.so
通过运行MySQL源码树下sql里的如下命令,你可以容易地为你的系统决定正确的编译器选项:
shell> make udf_example.o
你应该运行一个类似于make所显示那样的编译命令,除了要在行尾附近删除-c选项,并在行尾加上加上 -o udf_example.so。(在某些系统上,你可能需要在命令行留着-c 选项)。
编译好一个包含有UDF的共享目标后,你必须安装它并通知MySQL。从udf_example.cc编译一个共享目标文件产生一个名字类似于udf_example.so 的文件(确切名字可能因平台而异)。把这个文件复制到 /usr/lib 这样被你系统的动态(运行时)链接器搜索到的目录下,或者 把你放共享目标文件的目录添加到链接器配置文件(如,/etc/ld.so.conf )。
动态链接器的名字时系统特定的(如,在FreeBSD上是ld-elf.so.1 ,在Linux上是 ld.so,在Mac OS X上是dyld )。查看一下你系统的文档,看看链接器的名字是什么及如何配置链接器。
在许多系统上,你也可以设置环境变量LD_LIBRARY 或 LD_LIBRARY_PATH 指向你放UDF的目录。dlopen 手册会告诉你,在你系统上用哪个变量名。你可以在mysql.server 或 mysqld_safe 启动脚本里设置这个然后重启 mysqld。
在一些系统上,配置动态链接器的ldconfig不能识别不是以lib做名字开头的共享目标。在这种情况下,你应该把udf_example.so 改名为 libudf_example.so。
在Windows系统上,你可以通过下列步骤编译自定义函数:
你需要获得BitKeeper source repository for MySQL 5.1。 请参阅 2.8.3节,“从开发源树安装”。
在源数据仓里的VC++Files/examples/udf_example目录下,有名为udf_example.def, udf_example.dsp, 和 udf_example.dsw 的文件。
在数据仓的sql目录下,复制 udf_example.cc 文件到 VC++Files/examples/udf_example 目录,并改其名为udf_example.cpp。
Visual Studio VC++用打开 udf_example.dsw 文件,用它把UDF编译为一个一般项目。
共享目标文件安装完以后,为新函数信息修改 mysqld ,做如下声明:
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME 'udf_example.so'; mysql> CREATE FUNCTION myfunc_double RETURNS REAL SONAME 'udf_example.so'; mysql> CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME 'udf_example.so'; mysql> CREATE FUNCTION lookup RETURNS STRING SONAME 'udf_example.so'; mysql> CREATE FUNCTION reverse_lookup -> RETURNS STRING SONAME 'udf_example.so'; mysql> CREATE AGGREGATE FUNCTION avgcost -> RETURNS REAL SONAME 'udf_example.so';
可以使用DROP FUNCTION删除函数:
mysql> DROP FUNCTION metaphon; mysql> DROP FUNCTION myfunc_double; mysql> DROP FUNCTION myfunc_int; mysql> DROP FUNCTION lookup; mysql> DROP FUNCTION reverse_lookup; mysql> DROP FUNCTION avgcost;
CREATE FUNCTION 和 DROP FUNCTION 声明更新mysql 数据库中的func 系统表。函数名,类型和共享库名存进表中。你必须有mysql 数据库的INSERT 和DELETE 权限来创建和移除函数。
你不能使用 CREATE FUNCTION 去田间一个先前已经被创建的函数。如果你需要重新安装一个函数,你可以用DROP FUNCTION移除它,然后再用CREATE FUNCTION重新安装它。你可能会需要这么做,比如你重新编译新版本的函数以便mysqld得到这个新版本。不然,服务器还继续使用旧的版本。
一个有效程序是已被 CREATE FUNCTION加载且没有被DROP FUNCTION移除的函数。所有有效函数在每次服务器启动时重新加载,除非你使用--skip-grant-tables选项来启动mysqld。这种情况下,UDF的初始化将被跳过,UDF不可用。