2014-06-20 1 views
0

oracle에 Java 클래스를 함수로로드하려고합니다. 서버에서 나는 다음과 같이 LOADJAVA 사용 관리 : loadjava가 작동하지만 쿼리가 oracle sql 개발자에서 작동하지 않습니다.

C:\Users\n12017>loadjava -user USER1/passw E:\JAVA_repository\SOOSProjects\Mehmet_java_2db_trial\classes\mehmet_java_2db_trial\kondrakk.class 

그리고 오라클 DB 측의

: 나는 다음과 같이 쿼리를 적용 할 때

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'; 
/

그러나, 나는 오류가 발생했습니다. 여기

select ngram_kondrakk('mehmet','mehmet') from dual; 

오류입니다 (두 개의 동일한 문자열이 비교되기 때문에 쿼리의 결과로 나는 1의 유사성 점수를 기대하고있다) 마지막으로

ORA-29532: Java call terminated by uncaught Java exception: System error : java/lang/UnsupportedClassVersionError 
29532. 00000 - "Java call terminated by uncaught Java exception: %s" 
*Cause: A Java exception or error was signaled and could not be 
      resolved by the Java code. 
*Action: Modify Java code, if this behavior is not intended. 

, 여기에 내가 코드입니다

package mehmet_java_2db_trial; 

공용 클래스 kondrakk {

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)); 

} 
0123을 : 사용하려고

}

Please HELP! 사전에

감사합니다 ...

+0

'.class' 파일을 컴파일하는 데 사용한 Java 버전은 무엇입니까? 어떤 오라클 버전을 사용하고 있습니까? –

+0

oracle 11g를 사용 중이며 java 버전은 1.5입니다. –

+0

@LukeWoodward "ORA-29552 : Verifiedatiewaarschuwing : java.lang.UnsupportedClassVersionError : mehmet_java_2db_trial/kondrakk (지원되지 않는 major.minor 버전 51.0)"오류가 나타났습니다. 클래스 파일은 1.7 버전에서 만들어졌고 1.5 버전에서 만들어야합니다. 어떻게해야합니까? –

답변

0

컴파일 자바 클래스를 Oracle 데이터베이스로로드하려면 Java 클래스를 컴파일하여 Oracle 데이터베이스 내의 JVM으로 실행해야합니다.

Oracle 데이터베이스와 함께 제공되는 Java 버전은 현재 Java와 비교하여 일반적으로 오래된 버전입니다. Oracle 10g 및 1.5 with 11g에서 Java 1.4를 사용할 것으로 예상됩니다. 최선의 방법은 데이터베이스와 함께 제공되는 Java 컴파일러를 사용하는 것입니다.하지만 그렇게 할 수 없다면 -target 1.5 등을 사용하여 컴파일러가 클래스를 컴파일하여 Java 1.5에서 실행하도록하십시오.

0

귀하의 PLSQL의 래퍼 함수는 "/"

...mehmet_java_2db_trial/kondrakk.getDistance... 

/을 대체있다. [점]

docs 을 확인하고 이미 언급으로 - (DB에 "연결"되는 오라클 JVM이 될 것이다) 런타임에 대한 JVM과 편집의 JVM을 동기화