Run java from Oracle

Skulll
Дата: 17.03.2011 04:14:02
Всем привет!

Загрузил jar с помощью loadjava.

Скомпилировал класс.

select *
  from user_objects
 where object_type like 'JAVA%'
   and object_name = 'makesqr/magic';

OBJECT_NAMESUBOBJECT_NAMEOBJECT_IDDATA_OBJECT_IDOBJECT_TYPECREATEDLAST_DDL_TIMETIMESTAMPSTATUSTEMPORARYGENERATEDSECONDARYNAMESPACEEDITION_NAME
1makesqr/magic75717JAVA CLASS15.03.2011 20:51:4317.03.2011 3:42:472011-03-17:03:39:53VALIDNNN1


Вот метод который мне нужно

select *
  from user_java_methods
 where name like '%makesqr/magic%'
   and method_name = 'makesqr'
   and return_class = 'java/lang/String';

результ
NAMEMETHOD_INDEXMETHOD_NAMEACCESSIBILITYIS_STATICIS_FINALIS_SYNCHRONIZEDIS_NATIVEIS_ABSTRACTIS_STRICTARGUMENTSTHROWSARRAY_DEPTHBASE_TYPERETURN_CLASSIS_COMPILED
1makesqr/magic10makesqrPUBLICNONONONONONO010java/lang/StringNO


Как вы видите параметров у метода нет.

Создаю обётрку и вызываю метод
create or replace function makesqr
  return varchar2 is language java name 'makesqr/magic.makesqr() return java.lang.String';
/

  select makesqr() from dual;

Получаю ошибку

ORA-29531: отсутствует метод makesqr в классе makesqr/magic


Джава код работает прекрасно, использовал Оракловую джаву для запуска jar.

В чем может быть проблема?
Спасибо.
Вячеслав Банкет
Дата: 17.03.2011 06:21:51
Skulll,

Case sensivity?
-2-
Дата: 17.03.2011 07:51:31
Слеш на точу замени.
Skulll
Дата: 17.03.2011 11:54:39
-Вячеслав Банкет
Case sensivity?

А в каком месте? В джаве метод и класс с маленькой буквы.


-2-
Слеш на точу замени.

Заменил, тот же эффект.
Miha_S7
Дата: 17.03.2011 12:08:07
Skulll
Дата: 17.03.2011 14:01:29
Выяснилось что вызовы должны быть static для Оракла.

Ниже мой джава код. Я упростил функцию вызовы что бы она просто возвращала 1.
Я внес изменения в оригинальный код на джаве.
Сделал переменную iMCR статической. И функцию вызова статической String makesqr().

Сейчас при запуске из оракла я получаю ошибку.


ORA-29532: вызов Java прерван неустановленным исключением Java: java.lang.NoClassDefFoundError


При это вызов этого класса из командной строки работает.
Из кнсоли я запускаю класс такой командой.

c:\oracle\product\11.1.0\db_1\jdk\jre\bin\java.exe -classpath .\MagicDemoJavaApp;.\MagicDemoComp;"c:\Program Files\MATLAB\R2007a\toolbox\javabuilder\jar\javabuilder.jar";.\MagicDemoComp\makesqr.jar getmagic 5

Видимо дело сейчас в том как указать classpath при вызове из Оракла?


package makesqr;

import com.mathworks.toolbox.javabuilder.*;
import java.util.*;

public class magic implements Disposable
{
    private static MWMCR iMCR = null;
    private static Set sInstances = new HashSet();
    private static final MWFunctionSignature smakesqrSignature = new MWFunctionSignature(1, false, "makesqr", 1, false);
    public magic() throws MWException
    {
        iMCR = makesqrMCR.newInstance();
        // add this to sInstances
        synchronized(sInstances) {
            sInstances.add(this);
        }
    }
    
    public magic(String pathToComponent) throws MWException
    {
        iMCR = makesqrMCR.newInstance(pathToComponent);
        // add this to sInstances
        synchronized(sInstances) {
            sInstances.add(this);
        }
    }

    ******

    public static void main (String[] args)
    {
        try {
            MWMCR mcr = makesqrMCR.newInstance();
            mcr.runMain(smakesqrSignature, args);
            mcr.dispose();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    static
    {
        Runtime.getRuntime().addShutdownHook(new Thread(){public void run(){magic.disposeAllInstances();}});
    }

    ******

    public static String makesqr() throws MWException
    {
	return "1";
    }

-2-
Дата: 17.03.2011 14:17:08
Skulll,

SQL> set serveroutput on
SQL> exec dbms_java.set_output(20000)
SQL> var one number
SQL> exec :one := makesqr
--здесь должен появиться жавный стек ошибок
Skulll
Дата: 17.03.2011 15:13:27
-2-
Skulll,

SQL> set serveroutput on
SQL> exec dbms_java.set_output(20000)
SQL> var one number
SQL> exec :one := makesqr
--здесь должен появиться жавный стек ошибок


Спасибо, проблема была в правах. Я раздал права. Я вернул код в язве так что бы она делал то что задумывалось. Теперь другая ошибка.

SQL>  exec :one := makesqr
Exception in thread "Root Thread" java.lang.NullPointerException
        at makesqr.magic.makesqr(magic.java:246)
BEGIN :one := makesqr; END;

*
ошибка в строке 1:
ORA-29532: вызов Java прерван неустановленным исключением Java:
java.lang.NullPointerException
ORA-06512: на  "MICEX.MAKESQR", line 1
ORA-06512: на  line 1

Вот код вызываемой процедуры, 246 строка подсвечена красным
[/src] public static String makesqr() throws MWException
{
Object[] rhs = {1};
Object[] lhs = new Object[1];
System.out.println(smakesqrSignature.toString());
iMCR.invoke(Arrays.asList(lhs), Arrays.asList(rhs),
smakesqrSignature);
return lhs[0].toString();
}
[SRC JAVA]

В консоле как всегда приложение запускается на ура.

Прикрепил файл с джава кодом.
Skulll
Дата: 17.03.2011 15:22:10
Я вставил отладку на экран подозрительного класса.

if (iMCR == null) {
  System.out.println("iMCR is NULL");
} else {
  System.out.println("iMCR is not NULL");
}

И мои подозрения оправдались. В консоли он is not NULL, в Оракле is NULL!
Инициализация переменной iMCR происходит в конструкторе класс magic

    public magic() throws MWException
    {
        iMCR = makesqrMCR.newInstance();
        // add this to sInstances
        synchronized(sInstances) {
            sInstances.add(this);
        }
    }

Такое ощущение что инициализации не было.
-2-
Дата: 17.03.2011 15:37:16
Skulll
Такое ощущение что инициализации не было.
При вызове только статика - не было. Странно инициализировать статический атрибут в динамическом конструкторе, тем более при наличии статической секции.