近期有个需求需要实现汉字个数统计(由于db2不包括执行正则表达式匹配的功能),所以需要用db2的java UDF来实现,以下是在windows环境下的实现步骤:
以下是一个例子(实现目标符合正则表达式个数):
java代码如下:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Count
{
/**
* 按照正则匹配统计
* @param str
* @param regexp
* @return
*/
public static int countByRegexp(String str,String regexp){
int count = 0;
Pattern p = Pattern.compile(regexp);
Matcher m = p.matcher(str);
while(m.find()){
count++;
}
return count;
}
}
直接进入db2实例下的JDK或JVM编译java文件或将jvm/jdk拷贝到其他目录编译如下:
C:\Users\lucifel\Desktop\db2_java\jre\bin>javac.exe -d ....\ ....\Count.java
拷贝编译好的class文件到 DB2 实例的 sqllib/function 目录下 windows目录如:
C:\Program Files\IBM\SQLLIB\FUNCTION
最后注册新建函数 代码如下:
set current schema='TEST'
CREATE OR REPLACE FUNCTION count_by_regexp(str varchar(3000),msg varchar(3000))
RETURNS INTEGER
FENCED
NOT DETERMINISTIC
NO SQL
LANGUAGE JAVA
PARAMETER STYLE JAVA
EXTERNAL NAME 'Count.countByRegexp'
NO EXTERNAL ACTION
上边代码中count_by_regexp函数的参数分别对应java代码中的参数
类型String对应varchar,int对应INTEGER
RETURNS INTEGER --返回类型
EXTERNAL NAME 'Count.countByRegexp' --相应的类名和方法
最后执行测试看是否成功:
--获取目标字符串字母的个数
values TEST.count_by_regexp('休息休息2ac2c33','[a-zA-Z]')
结果如下没有问题
3