Пн Фев 20, 2012 21:41  доступ к операции из внешнего Java-приложения
Полезность: Нет оценки
Проблема такая:
Нужно из java-приложения запустить операцию-констурктор в ИБСО.
Дано:
Пользователь с логином user1
Справочник z#test, владелец справочника IBS.
Операция-констурктор в этом справочнике z$test_new#auto.new#auto_execute(...).
Представление в этом справочнике vw_crit_test_full
В Навигаторе user1 имеет доступ к этой операции, отрабатывает нормально. К представлению доступ по реквизиту, тоже все работает.
Теперь что я делаю в java-приложении:
Создаю соединение с ИБСОм,
затем делаю select executor.lock_open from dual; // заполняю контекст сессии
Теперь обащаюсь к представлению select ibs.vw_crit_test_full - данные возвращяются, причем с ограничением по реквизиту, точно так же как и в навигаторе.
Теперь запускаю операцию-конструктор:
CallableStatement proc = conn.prepareCall("{? = call IBS.Z$TEST_NEW#AUTO.NEW#AUTO_EXECUTE(null, null, 3, '333-333')}");
proc.registerOutParameter(1, oracle.jdbc.OracleTypes.NUMBER);
proc.execute();
Ошибка: ORA-06550: Строка 1, столбец 13:
PLS-00201: идентификатор 'IBS.Z$TEST_NEW#AUTO' должен быть объявлен
ORA-06550: Строка 1, столбец 7:
PL/SQL: Statement ignored
Я так понимаю что несмотря на то что в Навигаторе user1 к этой операции доступ имеет, через оракл он ее не видит.
Если из java соединится под IBSом, то приведенный выше вызов отрабатывает.
Если помимо АРМа "Админ доступа" дать grant execute on z#test_new#auto to user1, то тоже будет работать.
Как сделать чтобы из java-приложения можно было запускать операцию, подскажите пожалуйста, умные люди.
PS. делал трассировку на вызов опреации в Навигаторе, из трассировки мало что понял, но как мне показалось, вызов операции в навигаторе не происходит напрямую, он идет через вызов интерфейсных пакетов???
напишите библиотечную операцию - в ней функцию обертку под ваш вызов конструктора - там же можно прописать executor.lock_open в секции инициализации пакета
напишите библиотечную операцию - в ней функцию обертку под ваш вызов конструктора - там же можно прописать executor.lock_open в секции инициализации пакета
Написал, теперь библиотеку не может найти
ORA-06550: Строка 1, столбец 13:
PLS-00201: идентификатор 'IBS.Z$TEST_TEST_LIB' должен быть объявлен
ORA-06550: Строка 1, столбец 7:
PL/SQL: Statement ignored
вот текст библиотеки:
package body Z$TEST_TEST_LIB is
--#section PUBLIC
--#section PRIVATE
--# 1,1
procedure ADD(N IN number,C IN varchar2) is
plp$RESULT_1 number;
begin
--# 3,5
plp$RESULT_1 := Z$TEST_NEW#AUTO.NEW#AUTO_EXECUTE(NULL,'TEST',N,C);
return;
end;
-- INITIALIZATION
begin
-- begin pl/sql
execute immediate 'select ibs.executor.lock_open() from dual';
-- end pl/sql
end Z$TEST_TEST_LIB;
как оформлен теперь вызов процедуры из библиотеки в йава приложении ?
Код:
Statement stmt = conn.createStatement();
stmt.execute("Select ibs.executor.lock_open From dual");
ResultSet rset = conn.createStatement().executeQuery("select * from ibs.VW_CRIT_TEST_VIEW");
while ( rset.next() ) {
System.out.println(rset.getString(3)+"\t"+rset.getString(4));
count++;
}
CallableStatement proc2 = conn.prepareCall("{? = call IBS.Z$TEST_TEST_LIB.ADD(3, '333-333')}");
// Register the type of the return value
proc2.registerOutParameter(1, oracle.jdbc.OracleTypes.NUMBER);
//proc2.registerOutParameter(1, oracle.jdbc.OracleTypes.VARCHAR);
proc2.execute();
begin
IBS.Z$TEST_TEST_LIB.ADD(1,'test');
commit;
end;
цитирую пакет
package body Z$TEST_TEST_LIB is
--#section PUBLIC
--#section PRIVATE
--# 1,1
procedure ADD(N IN number,S IN varchar2) is
plp$RESULT_2 number;
plp$RESULT_1 PLS_INTEGER;
begin
--# 4,2
plp$RESULT_1 := EXECUTOR.LOCK_OPEN;
plp$RESULT_2 := Z$TEST_NEW_AUTO.NEW_AUTO_EXECUTE(NULL,'TEST',N,S);
EXECUTOR.LOCK_CLOSE;
return;
end;
end Z$TEST_TEST_LIB;
цитирую PL +
procedure add( n number, s varchar(32000)) is
x integer;
begin
executor.lock_open;
::[TEST].new_auto( n, s);
executor.lock_close;
end;
херррня какая-то блин
делаю exec IBS.Z$TEST1_TEST_LIB.ADD(4, '444-444');
через PL/SQL Developer
поначалу не работало, потом на 6 или 7 раз вдруг сработало, я аж сам не поверил, перезашёл, запускаю тоже самое, опять не работает.
Вообще в никакую не видит пакет, ругается что его надо объявить и все
надо взять портвейн и договориться с админом Oracle чтобы выдал права на пакет тому юзеру под кем выполняется PL/SQL Dev.. Я на вашем скриншоте пакет Z$TEST не наблюдаю.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
Домен cftclub.ru не связан с ЗАО "Центр Финансовых Технологий" и ни в коей мере не нарушает авторских и иных прав
Владелец может не разделять мнения Участников и не несет ответственности за их публикации
Powered by phpBB