DB2 7.2部署Java版Levenshtein距离UDF提示类不在类路径问题求助
解决步骤
- 修正JDK编译版本兼容性
IBM i平台DB2的Java运行环境版本低于本地编译JDK版本会直接导致类加载失败,编译代码时需指定和IBM i系统匹配的JDK版本,例如系统运行Java 8时,编译命令为:
javac -source 1.8 -target 1.8 FUNCTIONS/LEVENSHTEIN.java
- 修复文件权限问题
/QIBM/UserData/OS400/SQLLib/Function目录下的类文件、JAR包需要给QSYS用户授予读取权限,父目录授予执行权限,对应权限设置命令:
# 单独class文件部署时的权限设置 CHGAUT OBJ('/QIBM/UserData/OS400/SQLLib/Function/FUNCTIONS') USER(QSYS) DTAAUT(*RX) CHGAUT OBJ('/QIBM/UserData/OS400/SQLLib/Function/FUNCTIONS/LEVENSHTEIN.class') USER(QSYS) DTAAUT(*R) # JAR包部署时的权限设置 CHGAUT OBJ('/QIBM/UserData/OS400/SQLLib/Function/testMain.jar') USER(QSYS) DTAAUT(*R)
IBM i的IFS文件系统默认大小写敏感,需确认目录名、文件名和代码中包名、类名的大小写完全一致,包名是大写FUNCTIONS则对应目录名也必须为大写FUNCTIONS。
- JAR注册后刷新类路径
执行SQLJ.INSTALL_JAR注册JAR包后,必须调用刷新命令让DB2加载新的类路径:
CALL SQLJ.REFRESH_CLASSPATH();
- 修正UDF定义
当前UDF定义中READS SQL DATA属性不符合方法逻辑,该方法未执行任何SQL操作,改为NO SQL即可,正确的UDF定义如下:
- JAR包部署时的定义:
CREATE OR REPLACE FUNCTION DEBUG.LEVENSHTEIN( LHS VARCHAR(255), RHS VARCHAR(255) ) RETURNS INTEGER LANGUAGE JAVA SPECIFIC DEBUG.LEVENSHTEIN DETERMINISTIC NO SQL CALLED ON NULL INPUT EXTERNAL NAME 'JARFUNCTIONS:FUNCTIONS.LEVENSHTEIN.levenshteinDistance' PARAMETER STYLE JAVA;
- 单独class文件部署时的定义:
CREATE OR REPLACE FUNCTION DEBUG.LEVENSHTEIN( LHS VARCHAR(255), RHS VARCHAR(255) ) RETURNS INTEGER LANGUAGE JAVA SPECIFIC DEBUG.LEVENSHTEIN DETERMINISTIC NO SQL CALLED ON NULL INPUT EXTERNAL NAME 'FUNCTIONS.LEVENSHTEIN.levenshteinDistance' PARAMETER STYLE JAVA;
- 补充空值处理逻辑
原方法未处理入参为空的场景,传空值会触发空指针异常,建议在方法开头添加空值判断:
public static int levenshteinDistance (String lhs, String rhs) { // 新增空值处理 if (lhs == null) lhs = ""; if (rhs == null) rhs = ""; // 原有逻辑不变 int len0 = lhs.length() + 1; int len1 = rhs.length() + 1; ... }
内容的提问来源于stack exchange,提问作者Manu Andrei
相关产品推荐
相关产品推荐

