首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过UDR扩展GBase8s查询行为的工程实践

通过UDR扩展GBase8s查询行为的工程实践

作者头像
麒思妙想
发布2021-12-24 19:51:34
8100
发布2021-12-24 19:51:34
举报
文章被收录于专栏:麒思妙想麒思妙想

应用场景

最近遇到一个有意思的需求,即某个字段里面存放着一些列数字,以逗号分割,数字两两一组,33.112,23.11,22.321,24.3333没错,每一组就是一个坐标,现在需要将他们处理成Json字符串 [{"lnt":"23.11","lat":"33.112"},{"lnt":"24.3333","lat":"22.321"}],相信使用SPL也可以实现,但是,今天我们用一种对java程序员更友好的方式来解决这一问题,没错就是UDR(用户自定义例程)。

环境设置

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=UTF-8

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。

编写UDR

package wang.datahub;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONObject;

public class T {

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception{
  String str = "33.112,23.11,22.321,24.3333";
  System.out.println(parseToJson(str));
 }
 
 public static String parseToJson(String str){
  JSONArray res = new JSONArray();
  String[] datas = str.split(",");
  for(int i = 0; i < datas.length; i=i+2){
   Hashtable tempData = new Hashtable();
   tempData.put("lat", datas[i]);
   if(i+1<datas.length){
    tempData.put("lnt", datas[i+1]);
   }else{
    tempData.put("lnt", 0);
   }
   res.put(tempData);
  }
  
  return res.toString();
 }

}

这里我们将依赖一起打包了。

注意,必须使用1.6 编译,并打包成jar文件,可以使用如下命令编译, 打包

# 编译
javac Helloworld.java

# 打包
jar -cf Helloworld.jar Helloworld.class

将共享库放置于数据库服务器上

比如,放到

GBASEDBTDIR 目录下,则Hello.jar的位置为

GBASEDBTDIR/Helloworld.jar

数据库执行

# 注册jar , install_jar的参数:jar所在的绝对路径,安装后的名称 
execute procedure install_jar("file:/opt/GBASE/gbase/jsonp.jar", "jsonp");

# 更改jar
# execute procedure replace_jar("file:/opt/GBASE/gbase/Helloworld.jar", "jsonp");

# 删除jar
# execute procedure remove_jar("jsonp");

# 删除重名函数
drop function jsonudr;

# 创建udr
create function jsonudr(varchar(255))
returns varchar(254)
--with (not variant)
external name 'jsonp:wang.datahub.T.parseToJson(java.lang.String)'
language java;

# 执行
select jsonudr('1,2,3,4,5,6') from dual;

select jsonudr(t1.column1) from t1;

测试结果

结果符合预期,关于UDR那么我们就介绍到这里。

你好,我是 +7 ,一个大数据领域的硬核原创作者。 做过后端架构、数据库中间件、数据平台&架构、产品。 专注大数据领域,数据库领域实时动态&技术提升&个人成长&职场进阶

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-12-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 麒思妙想 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 应用场景
  • 环境设置
  • 编写UDR
  • 数据库执行
  • 测试结果
相关产品与服务
私有网络
私有网络(Virtual Private Cloud,VPC)是基于腾讯云构建的专属云上网络空间,为您在腾讯云上的资源提供网络服务,不同私有网络间完全逻辑隔离。作为您在云上的专属网络空间,您可以通过软件定义网络的方式管理您的私有网络 VPC,实现 IP 地址、子网、路由表、网络 ACL 、流日志等功能的配置管理。私有网络还支持多种方式连接 Internet,如弹性 IP 、NAT 网关等。同时,您也可以通过 VPN 连接或专线接入连通腾讯云与您本地的数据中心,灵活构建混合云。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档