GBase 8s数据库支持C和JAVA写的用户自定义例程(UDR),以扩展用户对数据库的操作的功能。
以下我们分别以简单的例子介绍C UDR和Java UDR。
作者: liaosnet 时间: 2020-05-16 分类: 默认分类,java开发,存储过程 阅读:944 次
C UDR
C UDR使用C语言为基础开发。
参考两个文档:《用户定义例程和数据类型开发者指南》和《DataBlade开发者工具用户指南》
1, 编写代码,示例使用简单的Hello.c
#include ` `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, 将共享库放置于数据库服务器上
比如,放到 G B A S E D B T D I R / u d r 目 录 下 , 则 H e l l o . s o 的 位 置 为 GBASEDBTDIR/udr 目录下,则Hello.so的位置为 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, 将共享库放置于数据库服务器上
比如,放到 G B A S E D B T D I R / u d r 目 录 下 , 则 H e l l o . j a r 的 位 置 为 GBASEDBTDIR/udr 目录下,则Hello.jar的位置为 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"``);
只需要注册的名称。