首页 > 解决方案 > ORA-29531: 类错误中没有方法

问题描述

我尝试在 PL/SQl 中编写一个 Wrapper 函数来调用 org.apache.commons.codec.language.colognephonetic 类的编码函数,如官方 apache commons wiki 中所述。科隆拼音阿帕奇

包装函数如下所示:

  function get_phonetic_string(i_string VARCHAR2) RETURN VARCHAR2 AS LANGUAGE java name 'org.apache.commons.codec.language.ColognePhonetic.encode(
                                          java.lang.String
                                          ) return java.lang.String';

但是,当我执行包装函数时,出现以下错误:ORA-29531: no method encode in class org/apache/commons/codec/language/ColognePhonetic。但显然有一个编码功能。

有人可以帮我弄清楚我做错了什么吗?

标签: javaoracleapacheplsql

解决方案


首先,确保org.apache.commons.codec.language.ColognePhonetic类在数据库中(它可能不会)。

SELECT *
FROM   ALL_OBJECTS
WHERE  OBJECT_TYPE LIKE '%JAVA%'
AND    LOWER( OBJECT_NAME ) LIKE '%colognephonetic%';

如果存在则应返回一行(可能需要以特权用户身份运行)。

如果它不存在,那么您将需要使用loadjava应用程序来加载包含类的 jar 库。

然后编写一个包装器来创建一个静态函数,该函数生成一个类的实例(未经测试):

CREATE JAVA SOURCE NAMED Phonetics AS
import org.apache.commons.codec.language.ColognePhonetic;

public class Phonetics {
  public static String encode(
    final String text
  ){
    final ColognePhonetic cp = new ColognePhonetic();
    return cp.encode( text );
  }
}
/

CREATE FUNCTION get_phonetic_string(i_string VARCHAR2) RETURN VARCHAR2 AS
  LANGUAGE JAVA NAME 'Phonetics.encode( java.lang.String ) return java.lang.String';

推荐阅读