通过udf和udaf机制,数据库用户能够使用c/c++语言自行定义开发函数,编译C文件为共享库并部署后,就可以在集群中创建udf和udaf函数并调用,如下:
1在安装GBase8a的服务器上编译C或C++程序的共享库,如:
gcc -fPIC func_toupper.c -shared -o func_toupper.so
2 将编译好的共享库拷贝到GBase8a安装路径的lib/gbase/plusin下
3.创建白定义函数,如:
gbase> create function func_toupper returns string soname 'func_toupper.so’;
4调用函数,如:
gbase> select func_toupper('abed’) from dual;
实际操作中可能会遇到的问题和解決方法如下:
1.编译时因缺少头文件报错,如:
$ gcc -fPIC arg_return_testl.c-shared -o arg_return_testl.so
arg_return_test1.c:127:26:致命错误:gbase_global.h:没有那个文件或目录
#include <gbase_global.h>
解決方法:将头文件gbase_global.h拷贝后,编译命令后添加”-l 头文件所在目录”如:
$ gcc -fPIC arg_return_testl.c -shared -o arg_return_testl.so -I include_
2,报錯Can't find symbol..in library
gbase create aggregate function arg_return_test1 returns real soname ‘arg_return_test1.so
ERROR 1704 (HY000): gluster function error: 10.10.11.50:Can't find symboI 'arg retum test1' in library.
udaf函数名、so文件名、so文件中的主函数名需要保持一致,当so文件中函数名与so文
名不统一,或创建的udaf函数名与so文件名不统一时,可能会出现以上报错。
解決方法:如果是so文件中函数名与so文件名不统一,需要修改c/c++文件中主函数名,使用重新编译后的so文件。
3.报结file...not exists
gbase> create function func_toupper_returns real soname 'func_toupper.so";
ERROR 1704 (HY000): gcluster function error: file /opt/10.10.11.50/gluster/ server/lib/gbase/plugin/func_toupper.so not exists
创建udf/udaf时需要将共享.so放在plugin目录下,查看参数show variables like ‘plugin_dir’可以得到该目录,单机层和集群层中都要有.so文件,否则报错。只需要拷到执行节点,其他节点自动同步库文件。
4. 如果更新了共享库.so文件,需要删除原来的udf/udaf函数之后重新创建。否则查询中使用的是原来的函数。