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");

只需要注册的名称。

标签: gbase 8s, udr, GBase, C UDR, Java UDR, 用户自定义例程

添加新评论