Plsql loadjava似乎可以工作,但查询在oracle sql developer上不起作用
我试图将java类作为函数加载到oracle。在服务器中,我设法使用loadjava,如下所示: C:\Users\n12017>loadjava-user USER1/passw E:\JAVA\u repository\SOOSProjects\Mehmet\u JAVA\u 2db\u trial\classes\Mehmet\u JAVA\u 2db\u trial\kondrakk.class 在oracle数据库端:Plsql loadjava似乎可以工作,但查询在oracle sql developer上不起作用,plsql,oracle-sqldeveloper,loadjava,Plsql,Oracle Sqldeveloper,Loadjava,我试图将java类作为函数加载到oracle。在服务器中,我设法使用loadjava,如下所示: C:\Users\n12017>loadjava-user USER1/passw E:\JAVA\u repository\SOOSProjects\Mehmet\u JAVA\u 2db\u trial\classes\Mehmet\u JAVA\u 2db\u trial\kondrakk.class 在oracle数据库端: create or replace function ngram_
create or replace function ngram_kondrakk(src in varchar2, trg in varchar2)
return float
as language java
name 'mehmet_java_2db_trial/kondrakk.getDistance(java.lang.string, java.lang.string) return java.lang.float';
/
然而,当我应用下面的查询时,我得到了一个错误。由于比较了两个相同的字符串,因此查询结果的相似性分数应该是1
select ngram_kondrakk('mehmet','mehmet') from dual;
以下是错误:
ORA-29532:未捕获的Java异常终止了Java调用:系统错误:Java/lang/UnsupportedClassVersionError
2953200000-未捕获的Java异常终止了Java调用:%s
*原因:发出Java异常或错误信号,无法执行
由Java代码解析。
*操作:修改Java代码,如果此行为不是故意的。
最后,以下是我尝试使用的代码:
package mehmet_java_2db_trial;
公共类康德拉克{
public static float getDistance(String source, String target) {
final int sl = source.length();
final int tl = target.length();
if (sl == 0 || tl == 0) {
if (sl == tl) {
return 1;
}
else {
return 0;
}
}
int n=3;
int cost = 0;
if (sl < n || tl < n) {
for (int i=0,ni=Math.min(sl,tl);i<ni;i++) {
if (source.charAt(i) == target.charAt(i)) {
cost++;
}
}
return (float) cost/Math.max(sl, tl);
}
char[] sa = new char[sl+n-1];
float p[]; //'previous' cost array, horizontally
float d[]; // cost array, horizontally
float _d[]; //placeholder to assist in swapping p and d
//construct sa with prefix
for (int i=0;i<sa.length;i++) {
if (i < n-1) {
sa[i]=0; //add prefix
}
else {
sa[i] = source.charAt(i-n+1);
}
}
p = new float[sl+1];
d = new float[sl+1];
// indexes into strings s and t
int i; // iterates through source
int j; // iterates through target
char[] t_j = new char[n]; // jth n-gram of t
for (i = 0; i<=sl; i++) {
p[i] = i;
}
for (j = 1; j<=tl; j++) {
//construct t_j n-gram
if (j < n) {
for (int ti=0;ti<n-j;ti++) {
t_j[ti]=0; //add prefix
}
for (int ti=n-j;ti<n;ti++) {
t_j[ti]=target.charAt(ti-(n-j));
}
}
else {
t_j = target.substring(j-n, j).toCharArray();
}
d[0] = j;
for (i=1; i<=sl; i++) {
cost = 0;
int tn=n;
//compare sa to t_j
for (int ni=0;ni<n;ni++) {
if (sa[i-1+ni] != t_j[ni]) {
cost++;
}
else if (sa[i-1+ni] == 0) { //discount matches on prefix
tn--;
}
}
float ec = (float) cost/tn;
// minimum of cell to the left+1, to the top+1, diagonally left and up +cost
d[i] = Math.min(Math.min(d[i-1]+1, p[i]+1), p[i-1]+ec);
}
// copy current distance counts to 'previous row' distance counts
_d = p;
p = d;
d = _d;
}
// our last action in the above loop was to switch d and p, so p now
// actually has the most recent cost counts
System.out.println(1.0f - (p[sl] / Math.max(tl, sl)));
return 1.0f - (p[sl] / Math.max(tl, sl));
}
}
请帮忙
提前感谢…您的plsql包装函数/
...mehmet_java_2db_trial/kondrakk.getDistance...
替换为。[点]
检查
如前所述,将编译的JVM与运行时的JVM同步,这将是连接到DB的Oracle JVM,当编译Java类以加载到Oracle数据库中时,请确保编译Java类以在Oracle数据库中与JVM一起运行
与当前的Java相比,Oracle数据库附带的Java版本通常已经过时:预计Oracle 10g将使用Java 1.4,11g将使用Java 1.5。最好的办法是使用数据库附带的Java编译器,但如果做不到这一点,请使用-target 1.5或类似的命令来强制编译器编译类以在Java 1.5上运行。编译.class文件时使用的Java版本是什么?您使用的是什么版本的Oracle?我使用的是Oracle 11g,服务器上的java版本是1.5。@LukeWoodward我刚刚注意到一个错误,说ORA-29552:VerificateWarschuing:java.lang.UnsupportedClassVersionError:mehmet_java_2db_试用版/KondrakUnsupported major.minor Version51.0。我的类文件似乎是在1.7版中创建的,我必须在1.5版中创建它。那么我该怎么做呢?您还没有回答我关于编译kondrakk.class文件时使用的Java版本的问题。如果您使用的是javac,您可以尝试将参数-target 1.5传递给javac。@LukeWoodward谢谢。当我尝试目标1.5时,效果很好。在没有说明-target1.5的情况下,编译使其成为1.7。