近期有個(gè)需求需要實(shí)現(xiàn)漢字個(gè)數(shù)統(tǒng)計(jì)(由于db2不包括執(zhí)行正則表達(dá)式匹配的功能)拔恰,所以需要用db2的java UDF來(lái)實(shí)現(xiàn)均抽,以下是在windows環(huán)境下的實(shí)現(xiàn)步驟:
實(shí)現(xiàn)步驟
以下是一個(gè)例子(實(shí)現(xiàn)目標(biāo)符合正則表達(dá)式個(gè)數(shù)):
java代碼如下:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Count
{
/**
* 按照正則匹配統(tǒng)計(jì)
* @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;
}
}
直接進(jìn)入db2實(shí)例下的JDK或JVM編譯java文件或?qū)vm/jdk拷貝到其他目錄編譯如下:
C:\Users\lucifel\Desktop\db2_java\jre\bin>javac.exe -d ....\ ....\Count.java
拷貝編譯好的class文件到 DB2 實(shí)例的 sqllib/function 目錄下 windows目錄如:
C:\Program Files\IBM\SQLLIB\FUNCTION
最后注冊(cè)新建函數(shù) 代碼如下:
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函數(shù)的參數(shù)分別對(duì)應(yīng)java代碼中的參數(shù)
類(lèi)型String對(duì)應(yīng)varchar,int對(duì)應(yīng)INTEGER
RETURNS INTEGER --返回類(lèi)型
EXTERNAL NAME 'Count.countByRegexp' --相應(yīng)的類(lèi)名和方法
最后執(zhí)行測(cè)試看是否成功:
--獲取目標(biāo)字符串字母的個(gè)數(shù)
values TEST.count_by_regexp('休息休息2ac2c33','[a-zA-Z]')
結(jié)果如下沒(méi)有問(wèn)題
3