powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / как заставить oracle видеть java-class ?
14 сообщений из 14, страница 1 из 1
как заставить oracle видеть java-class ?
    #38036421
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток !

имеем
- oracle 11g
- чужие jar

загружаю jar-ки в базу (loadjava ...).

в тесте получаю:
Код: plsql
1.
2.
3.
[Error] Execution (2: 1): ORA-29532: Java call terminated by uncaught Java exception: java.lang.NoClassDefFoundError: com/portal/pcm/fields/FldOpCorrelationId
ORA-06512: at "TEST_CONNECT", line 1
ORA-06512: at line 5


однако,
Код: plsql
1.
2.
3.
4.
5.
6.
select *
from sys.USER_JAVA_CLASSES
where 
  NAME like 'com/portal/pcm/fields/FldOpCorrelationId'

com/portal/pcm/fields/FldOpCorrelationId	46	0	INTERFACE	PUBLIC	NO	NO	NO	NO	-	com/portal/pcm/StrField	-



Если я в своем коде напрямую использую
Код: plsql
1.
 com.portal.pcm.fields.FldOpCorrelationId o = null;


то класс находится без проблем.

Куда копать ??
...
Рейтинг: 0 / 0
как заставить oracle видеть java-class ?
    #38036472
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой статус java-класса?
Код: plsql
1.
2.
3.
4.
select object_type, object_name, dbms_java.longname(object_name) longname, status
from OBJ
where object_type like 'JAVA%'
  and dbms_java.longname(object_name) = 'com/portal/pcm/fields/FldOpCorrelationId';


и как выглядит процедура TEST_CONNECT?
...
Рейтинг: 0 / 0
как заставить oracle видеть java-class ?
    #38036500
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Денис, приветствую !

Код: plsql
1.
2.
3.
4.
5.
6.
select object_type, object_name, dbms_java.longname(object_name) longname, status
from OBJ
where object_type like 'JAVA%'
  and dbms_java.longname(object_name) = 'com/portal/pcm/fields/FldOpCorrelationId';

JAVA CLASS	/2475b4d5_FldOpCorrelationId	com/portal/pcm/fields/FldOpCorrelationId	VALID



процедурка простая,
В обычной java - работает. С этими же либами портала (oracle BRM).
Такое ощущение, что когда получается ответ от портала и начинает строится результирующий FList используется рефлексия...
Не может ли здесь засада присутствовать ?

Представляешь, что есть BRM ?
...
Рейтинг: 0 / 0
как заставить oracle видеть java-class ?
    #38036503
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denis Popov,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED peresetsky."TestConnect" AS

import com.portal.pcm.*;
import com.portal.pcm.fields.*;

public class TestConnect {

    private static long  db = 1;
    private static long  id = -1;

    public static String test_connect () {
    
        com.portal.pcm.fields.FldOpCorrelationId o = null;
    
        PortalContext ctx = null;
        try {
            ctx = ContextHelper.getContext();
           
        //создание параметра  PIN_FLD_ARGS
        FList fld_args;
        fld_args = new FList();
        fld_args.set(FldAccountNo.getInst(),"0.0.0.1-58727");
        SparseArray argsArray = new SparseArray();
        argsArray.add(1,fld_args);

        //создание параметра  PIN_FLD_RESULTS
        SparseArray resultsArray = new SparseArray();
        resultsArray.add(0,(FList)null);

        // создание конечного OP-кода
            FList flist = new FList();

            //заполнение PIN_FLD_ARGS
            flist.set(FldArgs.getInst(),argsArray);
            //заполнение PIN_FLD_FLAGS
            flist.set(FldFlags.getInst(),256);
            //заполнение PIN_FLD_TEMPLATE
            flist.set(FldTemplate.getInst(),"select X  from /account where F1 = V1 ");
            //заполнение PIN_FLD_RESULTS
            flist.set(FldResults.getInst(),resultsArray);
            //заполнение PIN_FLD_POID
            flist.set(FldPoid.getInst(), new Poid(db, id, "/search"));

            FList outflist = ctx.opcode(PortalOp.SEARCH, flist);
           
           
           ContextHelper.release();
           return outflist.toXMLString();
        }
        catch (Exception e) {
           //e.printStackTrace();
            if (ctx!=null){ContextHelper.release();};

            StackTraceElement[] st = e.getStackTrace();
            StringBuffer sb = new StringBuffer();
            for (StackTraceElement el : st) {
                sb.append(el.toString()+"\n");
            }
           
           
           return sb.toString();
        }
    }
    
    public static void test1() {
         com.portal.pcm.fields.FldOpCorrelationId o = null;
    }
    
}
...
Рейтинг: 0 / 0
как заставить oracle видеть java-class ?
    #38036514
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну и для полноты картины

эта выдает ошибку:

Код: plsql
1.
2.
3.
4.
CREATE OR REPLACE function peresetsky.test_connect return varchar2
   as
   language java
    name 'TestConnect.test_connect() return String';



эта работает:
Код: plsql
1.
2.
3.
4.
CREATE OR REPLACE procedure peresetsky.test_connect1
   as
   language java
    name 'TestConnect.test1()';
...
Рейтинг: 0 / 0
как заставить oracle видеть java-class ?
    #38036640
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Igor-65,

ошибку выдает, конечно вызов функции, а не ее создание :)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare
   str varchar2(32000);
begin
   --test_connect1;
   str := test_connect;
   DBMS_OUTPUT.PUT_LINE(str);
end;   

[Error] Execution (2: 1): ORA-29532: Java call terminated by uncaught Java exception: java.lang.NoClassDefFoundError: com/portal/pcm/fields/FldOpCorrelationId
ORA-06512: at "PERESETSKY.TEST_CONNECT", line 1
ORA-06512: at line 5
...
Рейтинг: 0 / 0
как заставить oracle видеть java-class ?
    #38036748
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже, проблему локализовал.
Оракловая java не понимает, что такое рефлексия.

попытка в java-коде получить класс:
Код: plsql
1.
2.
3.
4.
5.
6.
Class cl_str = Class.forName("java.lang.String");

[Error]  (0: 0): TestConnect:66: unreported exception java.lang.ClassNotFoundException; must be caught or declared to be thrown
[Error]  (0: 0):          cl_FldOpCorrelationId = Class.forName("java.lang.String");
[Error]  (0: 0):                                               ^
[Error]  (0: 0): 1 error


а в либах, которые я грузил, это используется...

Есть ли другой способ подсунуть оракловой java эти либы ?
Или это безнадежно ?
...
Рейтинг: 0 / 0
как заставить oracle видеть java-class ?
    #38036757
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor-65, если перезаправить java-вский вывод в output, может там будет дополнительная информация?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
declare
   str varchar2(32000);
begin
   dbms_java.set_output(2000);
   str := test_connect;
   DBMS_OUTPUT.PUT_LINE(str);
end;
/
...
Рейтинг: 0 / 0
как заставить oracle видеть java-class ?
    #38036799
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor-65а в либах, которые я грузил, это используется...
И пускай:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or replace and resolve java source named "Test" as
public class Test {
  public static void foo() throws ClassNotFoundException {
    Class.forName("java.lang.String");
  }
}
/
create or replace procedure TEST_FOO as language java name 'Test.foo()';
/
begin
  dbms_java.set_output(2000);
  TEST_FOO();
end;
/
...
Рейтинг: 0 / 0
как заставить oracle видеть java-class ?
    #38036829
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Денис,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare
   str varchar2(32000);
begin
   dbms_java.set_output(2000);
   str := test_connect;
   DBMS_OUTPUT.PUT_LINE(str);
end;

Creating PCM context using configuration supplied in a Properties object...
Exception in thread "Root Thread" java.lang.NoClassDefFoundError: com/portal/pcm/fields/FldOpCorrelationId
	at ContextHelper.createContextUsingProperties(ContextHelper:54)
	at ContextHelper.getContext(ContextHelper:26)
	at TestConnect.test_connect(TestConnect:15)



т.е. вылетает на
context.connect(props);

файл Infranet.properties я загрузил..

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
import com.portal.pcm.EBufException;
import com.portal.pcm.PortalContext;

import java.io.IOException;
import java.util.Properties;

/**
 * Created by IntelliJ IDEA.
 * User: peresetsky
 * Date: 09.11.12
 * Time: 10:53
 * To change this template use File | Settings | File Templates.
 */
public class ContextHelper {

    private static String hostname="10.110.32.59";
    private static String port="11950";
    private static String login="login";
    private static String password="password";

    private static PortalContext ctx = null;

    public static PortalContext getContext() throws IOException {
        if (ctx==null) {
            ctx = createContextUsingProperties();

        }
        return ctx;
    }

    private static PortalContext createContextUsingProperties() throws IOException {
        System.out.println("---------------------------------------------------------------");
        System.out.println("Creating PCM context using configuration supplied in a Properties object...");
        Properties props = new Properties();
        PortalContext context = null;

        props.put("infranet.connection",
                  "pcp://" + login + ":" +
                          password + "@" +
                          hostname +
                  ":" + port + "/service/admin_client 1");


        props.put("infranet.login.type", "1");

        try {
            context = new PortalContext();
            context.connect(props);

            System.out.println("Context successfully created.");
            // print out some info about the connection
            System.out.println("current DB: " + context.getCurrentDB());
            System.out.println("user ID:    " + context.getUserID());

        } catch (EBufException ebufex) {
            System.out.println("Your connection to the server failed.");
            System.out.println(" * Have you modified 'HOST', 'LOGIN', 'PASSWORD' and 'PORT' variables at the top of this example?");
            System.out.println(" * Is the Infranet server CM up?");
            System.out.println("Here's the error:");
            System.out.println(ebufex);
            System.exit(1);
        }

        return context;
    }

    public static void release() {
        if (ctx!=null) {
            try {
                ctx.close(true);
                System.out.println("PCM connection closed.");
            } catch (EBufException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
    }
 }
...
Рейтинг: 0 / 0
как заставить oracle видеть java-class ?
    #38036850
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor-65файл Infranet.properties я загрузил..
Могу ошибатсья и дело не в этом, но тут сказано:
The Properties object requires two key/value entries:
Key: Value: Infranet.connect Connection_string Infranet.login.type 1

у тебя же первая строка с ключем "infranet.connection", а не "Infranet.connect"
...
Рейтинг: 0 / 0
как заставить oracle видеть java-class ?
    #38036867
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думаю, дело не в этом, т.к. прежде, чем грузить в oracle, я все отладил в сторонке.

Если декомпилить PortalContext и PortalProperties

то станет очевидно, что ищется infranet.connection. (так же и в примерах к порталу)
Тут ошибка в доке, что ты приложил.

PortalContext:
Код: plsql
1.
String str1 = getProperty("connection");


PortalProperties:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 private static String getSysProperty(String paramString1, String paramString2)
  {
    StringBuffer localStringBuffer = new StringBuffer("infranet.");
    if (paramString1 != null)
      localStringBuffer.append(paramString1).append(".").append(paramString2);
    else
      localStringBuffer.append(paramString2);
    String str = sysprops.getProperty(localStringBuffer.toString());
    if ((str == null) && (paramString1 != null))
      str = sysprops.getProperty("infranet." + paramString2);
    return str;
  }
...
Рейтинг: 0 / 0
как заставить oracle видеть java-class ?
    #38036907
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может, есть исходники pcm.jar ?
...
Рейтинг: 0 / 0
как заставить oracle видеть java-class ?
    #38036915
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если идей никаких нет, то буду строить иначе.
Хотелось избежать еще одного узла в транспортной цепочке :)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / как заставить oracle видеть java-class ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]