暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GBase 8s 编写使用UDR(C/Java)

liaosnet 2020-05-16
2104

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一致

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.0jar", "JUDRHello");

9,删除Java UDR例程的操作

删除对应的函数

drop function judrhello;

移除对应的注册的jar

execute procedure remove_jar("JUDRHello");

只需要注册的名称。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论