#plsql #oracle-sqldeveloper #loadjava
#plsql #oracle-sqldeveloper #loadjava
Вопрос:
Я пытаюсь загрузить класс Java в oracle как функцию. На сервере мне удалось использовать loadjava, как показано ниже:
C:Usersn12017>loadjava -user USER1/passw E:JAVA_repositorySOOSProjectsMehmet_java_2db_trialclassesmehmet_java_2db_trialkondrakk.class
И на стороне oracle 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';
/
Однако, когда я применяю запрос, как показано ниже, я получил ошибку. (В результате запроса я ожидаю, что оценка сходства составит 1, поскольку сравниваются две идентичные строки)
select ngram_kondrakk('mehmet','mehmet') from dual;
Вот ошибка:
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));
}
}
Пожалуйста, ПОМОГИТЕ!
Заранее спасибо…
Комментарии:
1. Какую версию Java вы использовали для компиляции вашего
.class
файла? Какую версию Oracle вы используете?2. Я использую oracle 11g, а версия java на сервере 1.5.
3. @LukeWoodward я только что заметил ошибку «ORA-29552: Verificatiewaarschuwing: java.lang. Ошибка UnsupportedClassVersionError: mehmet_java_2db_trial /kondrakk (неподдерживаемая основная.младшая версия 51.0) «. Кажется, мой файл класса создан в версии 1.7, и я должен создать его в версии 1.5. Итак, как я могу это сделать?
4. Вы не ответили на мой вопрос о том, какую версию Java вы использовали для компиляции своего
kondrakk.class
файла. Если вы используетеjavac
, вы можете попробовать передать аргумент-target 1.5
javac
.5. @LukeWoodward спасибо. Когда я попробовал -target 1.5, это сработало хорошо. Без указания -target 1.5 компиляция делает его 1.7.
Ответ №1:
При компиляции классов Java для загрузки в базу данных Oracle убедитесь, что вы скомпилировали свои классы Java для запуска с JVM внутри базы данных Oracle.
Версия Java, которая поставляется с базой данных Oracle, обычно устарела по сравнению с текущей Java: ожидайте использования Java 1.4 с Oracle 10g и 1.5 с 11g. Лучше всего использовать компилятор Java, который поставляется с базой данных, но если вы не можете этого сделать, используйте -target 1.5
или подобное, чтобы заставить компилятор компилировать классы для запуска на Java 1.5.
Ответ №2:
Ваша функция-оболочка plsql имеет «/»
...mehmet_java_2db_trial/kondrakk.getDistance...
замените / на .[точка]
Проверьте документы и, как уже упоминалось, синхронизируйте JVM компиляции с JVM во время выполнения (это будет Oracle JVM, которая «подключена» к БД)