GBase 8s 编写使用UDR(C/Java)
GBase 8s数据库支持C和JAVA写的用户自定义例程(UDR),以扩展用户对数据库的操作的功能。
以下我们分别以简单的例子介绍C UDR和Java UDR。
C UDR
C UDR使用C语言为基础开发。
参考两个文档:《用户定义例程和数据类型开发者指南》和《DataBlade开发者工具用户指南》
1, 编写代码,示例使用简单的Hello.c
#include <stdio.h>
char *Hello(char *message )
{
return(message);
}
main()
{
char *message = "Hello World!";
printf("%s\n", Hello(message));
}
2, 编译成共享库Hello.so
gcc -c -fPIC -o Hello.o Hello.c
gcc -shared -o Hello.so Hello.o
3, 将共享库放置于数据库服务器上
比如,放到$GBASEDBTDIR/udr 目录下,则Hello.so的位置为$GBASEDBTDIR/udr/Hello.so
4, 在需要该函数的库里创建相应的函数CDURHello
create function CUDRHello(varchar(255))
returns varchar(254)
with (not variant)
external name '$GBASEDBTDIR/udr/Hello.so(Hello)'
language c;
5, 执行CUDRHello函数
select cudrhello('C UDR返回天津南大通用') from dual;
返回结果: C UDR返回天津南大通用
6, 函数删除
对于C UDR,不再需要该函数了,需要先在数据库删除函数,然后删除对应的共享库。
drop function CUDRHello;
Java UDR
Java UDR实际的功能与C UDR一致
但需要额外配置SBSPACE空间。
0, 创建sbspace空间
onspaces -c -S sbspace01 -p /data/gbase/sbspace01 -o 0 -s 1024000
更新ONCONFIG配置文件中SBSPACENAME为sbspace01
SBSPACENAME sbspace01
1, 编写代码,示例使用简单的Hello.java
public class Hello {
public static void main(String[] args){
System.out.println(Hello("Java UDR: Hello World!"));
}
public static String Hello(String str){
return str;
}
}
2, 使用JDK1.6(注意,必须使用1.6)编译,并打包成jar文件
javac Hello.java
jar -cf Hello.jar Hello.class
3, 将共享库放置于数据库服务器上
比如,放到$GBASEDBTDIR/udr 目录下,则Hello.jar的位置为$GBASEDBTDIR/udr/Hello.jar
4, 设置数据库的JVP环境
ONCONFIG配置文件涉及到JVP的相关参数
1)VPCLASS开启jvp,用于处理Java UDR,默认不开启,取消前面的注释符'#'
VPCLASS jvp,num=1
2)JVPARGS增加 -Dfile.encoding=UTF-8(根据实际需要增加与否,即直接java执行的参数)
JVPARGS -Dcom.ibm.tools.attach.enable=no;-Dfile.encoding=GBK
3)JVPCLASSPATH增加依赖包的路径(如果函数需要额外的依赖包的话)
如:依赖 $GBASEDBTDIR/extend/krakatoa/commons-codec-1.9.jar
JVPCLASSPATH $GBASEDBTDIR/extend/krakatoa/krakatoa.jar:$GBASEDBTDIR/extend/krakatoa/jdbc.jar:$GBASEDBTDIR/extend/krakatoa/commons-codec-1.9.jar
重启数据库生效,通过onstat -g glo确认已经增加的jvp。
5, 在需要该函数的库里注册jar
execute procedure install_jar("file:$GBASEDBTDIR/udr/Hello.jar", "JUDRHello");
install_jar的参数:jar所在的绝对路径,安装后的名称。
6, 创建相应的例程
create function JUDRHello(varchar(255))
returns varchar(254)
with (not variant)
external name 'JUDRHello:Hello.Hello(java.lang.String)'
language java;
其中function中的 Hello(varchar(255))应与Java中的定义相对应;
external name 为java中的名称: 安装后的名称:java类名.方法
7, 执行JUDRHello函数
select judrhello('Java UDR返回天津南大通用') from dual;
返回结果: Java UDR返回天津南大通用
8, 修改Java UDR例程的操作
修改指定注册名称的对应的jar新路径或者名称
如:JUDRHello使用新的jar包替换掉之前的
execute procedure replace_jar("file:$GBASEDBTDIR/udr/Hello-1.0.jar", "JUDRHello");
9,删除Java UDR例程的操作
删除对应的函数
drop function judrhello;
移除对应的注册的jar
execute procedure remove_jar("JUDRHello");
只需要注册的名称。