最近遇到一个有意思的需求,即某个字段里面存放着一些列数字,以逗号分割,数字两两一组,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。
编写UDRpackage 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 { 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这里我们将依赖一起打包了。
注意,必须使用1.6 编译,并打包成jar文件,可以使用如下命令编译, 打包
# 编译 javac Helloworld.java # 打包 jar -cf Helloworld.jar Helloworld.class将共享库放置于数据库服务器上
比如,放到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那么我们就介绍到这里。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)