Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JAVA call Oracle procedure / 17 сообщений из 17, страница 1 из 1
30.03.2013, 10:52:17
    #38205291
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
Всем добрый день!
Есть партнерское API - оно представляет из себя Пакет функций в оракле , каждая функция возвращает данные в виде XML

вопрос какие инструменты есть в java чтобы эффективно работать с этим пакетом?

Что нужно : используя функции пакета организовать GUI интерфейс (веб) .
В интерфейсе можно по средствам процедур создавать объекты предметной области.

Для простоты пусть есть таблица customers для нее описан пакет функций получить все записи, найти по id, добавить, удалить, редактировать, создать копию...

Обычно всегда получал курсов или сам писал нужные мне запросы, а тут уже готовое API !?

как можно из xml данных положить их сразу в POJO или ENTITY отображение ?
...
Рейтинг: 0 / 0
30.03.2013, 13:24:55
    #38205371
Alex Serezhenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
как можно из xml данных положить их сразу в POJO или ENTITY отображение ?
JAXB, Castor позволяет это делать.
...
Рейтинг: 0 / 0
30.03.2013, 14:49:59
    #38205416
Alex Serezhenko
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
вопрос про использование апи мне не понятен. Какие проблемы в вызове готовых методов?
...
Рейтинг: 0 / 0
31.03.2013, 12:46:22
    #38205934
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
Alex Serezhenko,

Как вызвать процедуру из java я примерно понимаю. А вот когда она возвращает не курсор а портянку xml у меня возникает вопрос производительности
...
Рейтинг: 0 / 0
31.03.2013, 12:55:20
    #38205940
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
Atum1,

Jdbc, spring tools for jdbc
...
Рейтинг: 0 / 0
31.03.2013, 14:38:44
    #38206023
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
Atum1,
Ну дак меняй xml на орм и не будет вопросов по прозводительости. У тебя хмл заменяет объекты из бд.
...
Рейтинг: 0 / 0
31.03.2013, 22:31:45
    #38206362
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
Petro123,

В принципе на любом бине помеченном как entity можно добавить аннотации в стиле rootxlmelement и jaxb с его маршалингом и демаршалингом практически не будет отличаться от класической схемы с em.persist итд
...
Рейтинг: 0 / 0
31.03.2013, 23:10:35
    #38206380
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
Atum1,
ну дак тыж говорил про портянку XML?
Грань между оверхедом и чтобы работало - очень тонкая. Надо знать детали....формат XML и т.д.
Курсор XXXSet или ОРМ это далеко не портянка XML.
Всё равно ведь тестировать - делай тест и проверяй тормоза.
По крайней мере, DataSet умеет подкачивать и кешировать. А XML АПИ, пока не сгенерирует весь файл - тебе его не отдаст.
...
Рейтинг: 0 / 0
07.04.2013, 13:35:03
    #38216033
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
Сегодня получил описание API - оказалось что это пакет оракл с набором именно Функций!

описанных в виде
классификаторов для разных типов .
Код: xml
1.
2.
--- возвращает список txt \ html \ xml
---function MESSAGE_TYPES_LIST return XMLTYPE;



а так же позволяющий работать с employee - получить employee по id, gjkexbnm list employee , поменять значение employee итд.
Реализован полный API для работы с классом employee (CRUD)

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
--- возвращает список employees
---function EMPLOYEE_LIST return XMLTYPE;
---  employee  требуется id 
---function EMPLOYEE_GET return XMLTYPE;
---  employee  требуется id 
---function EMPLOYEE_SET return XMLTYPE;
---  employee  создается новый
---function EMPLOYEE_ADD return XMLTYPE;
---  employee  требуется id 
---function EMPLOYEE_DELETE return XMLTYPE;




почитал документацию , посмотрел примеры, но из java так и не получилось добавить нового employee , удалить, изменить его и получить весь список.


вопрос ко всем , кто сталкивался с таким типом , как с ним работать ?
пакет оформлен как сервис oracle :
EMPLOYEE_PACKAGE.EMPLOYEE_LIST

Как я понимаю нужен некоторый код который вернет мне что то типа XMLTYPE!

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
connection = ds.getConnection();
stmt = (OracleCallableStatement) connection.prepareCall("{ ? = call EMPLOYEE_PACKAGE.EMPLOYEE_LIST() }");
stmt.registerOutParameter(1, OracleTypes.OPAQUE,"SYS.XMLTYPE");
OracleResultSet rs = (OracleResultSet) stmt.executeQuery();

или нужно делать 
???
oracle.sql.OPAQUE  result = (OPAQUE) stmt.getObject(1);

или как то так ? 
stmt.execute();
 XMLType employeexml = XMLType.createXML(stmt.getOPAQUE(1)); 
   
Document employeedoc = (Document) employeexml.getDOM(); 



Проблема в том что объект
OracleResultSet rs - это не ResultSet , это OracleResultSetImpl - а точнее объект XMLTYPE,

поэтому него я не могу получить rs.next() - его там просто нет?! или такая схема работы в корне неверная и надо делать как то по другому ...

вопрос как?


так же хотелось бы делать эти вызовы не через connection.prepareCall - а через

EntityManager у меня есть уровень бизнес логики реализованной на EJB ! поэтому вопрос , как такой пакет функций дергать из

EntityManager 'а ?
...
Рейтинг: 0 / 0
07.04.2013, 18:19:39
    #38216249
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
Atum1,
www.oracle.su/docs/11g/appdev.112/e10492/xdb11jav.htm
...
Рейтинг: 0 / 0
08.04.2013, 09:52:21
    #38216606
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
Petro123Atum1,
www.oracle.su/docs/11g/appdev.112/e10492/xdb11jav.htm

так как описано у меня вызвать не получается :(

Код: java
1.
2.
3.
4.
5.
6.
        connection = ds.getConnection();
        stmt = (OracleCallableStatement) connection.prepareCall("{ ? = call EMPLOYEE_PACKAGE.EMPLOYEE_LIST() }");
        stmt.registerOutParameter(1, OracleTypes.OPAQUE,"SYS.XMLTYPE");
        stmt.execute();

        OPAQUE opaque = stmt.getOPAQUE(1);




stmt.getOPAQUE(1) - РАВНО null

т.е. проблема в том что я не понимаю или не могу получить значение ни от stmt ни от ResultSet .

если rs.next()- исполняется, то вот первого элемента в нем нет !? rs.getString(1) - это всегда null

возвращается мне OracleResultSet rs = (OracleResultSet) stmt.getResultSet();

точнее OracleResultSetImpl


через
Код: java
1.
OraclePreparedStatement stmt1 = (OraclePreparedStatement) connection.prepareStatement("select EMPLOYEE_PACKAGE.EMPLOYEE_LIST() from dual ");



эффект такой же
...
Рейтинг: 0 / 0
08.04.2013, 12:28:59
    #38216932
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
Atum1 stmt.getOPAQUE(1) - РАВНО null
Функция точно что-то возвращает, если ее вызвать в sqlplus?
Код: plsql
1.
select EMPLOYEE_PACKAGE.EMPLOYEE_LIST() from DUAL;


Еще - какой версии jdbc-драйвер? Попробуй заменить функцию своей, для проверки:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Connection con;
...
Statement st = con.createStatement();
st.execute(
  "create or replace function GET_EMPLOYEE_LIST return XmlType as\n" +
  "begin\n" +
  "  return dbms_xmlgen.getXmlType('select * from scott.EMP');\n" +
  "end;"
);

OracleCallableStatement cst = (OracleCallableStatement) con.prepareCall("{? = call GET_EMPLOYEE_LIST()}");
cst.registerOutParameter(1, OracleTypes.OPAQUE, "SYS.XMLTYPE");
cst.execute();
OPAQUE opaque = cst.getOPAQUE(1);
XMLType xml = XMLType.createXML(opaque);

System.out.println(xml.getStringVal());
cst.close();
st.close();
con.close();
...
Рейтинг: 0 / 0
08.04.2013, 12:29:13
    #38216933
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
Atum1,
я бы на твоём месте:
- проверил версии библиотек и убедился что они - полследние. Т.к. такой API на XML надо ещё выдумать)
- написал вот такой пример один в один вместе с тестовой хранимкой (чтобы результат запроса БД точно выдавала)
Код: java
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.
public void doCall (String[] args) 
  throws Exception 
  { 
//  CREATE OR REPLACE FUNCTION getPurchaseOrder(reference VARCHAR2) 
//  RETURN XMLTYPE 
//  AS 
//    xml XMLTYPE; 
//  BEGIN 
//    SELECT OBJECT_VALUE INTO xml 
//      FROM purchaseorder 
//      WHERE XMLCast(XMLQuery('$p/PurchaseOrder/Reference'
//                             PASSING OBJECT_VALUE AS "p" RETURNING CONTENT)
//                    AS VARCHAR2(30))
//            = reference;
//      RETURN xml; 
//  END; 
    String SQLTEXT = "{? = call getPurchaseOrder('BLAKE-2002100912333601PDT')}"; 
    CallableStatement sqlStatement = null; 
    XMLType xml = null; 
    super.doSomething(args); 
    createConnection(); 
    try 
    { 
      System.out.println("SQL := " + SQLTEXT); 
      sqlStatement = getConnection().prepareCall(SQLTEXT); 
      sqlStatement.registerOutParameter (1, OracleTypes.OPAQUE,"SYS.XMLTYPE"); 
      sqlStatement.execute(); 
      xml = (XMLType) sqlStatement.getObject(1); 
      System.out.println(xml.getStringVal()); 
    } 
    catch (SQLException SQLe) 
    { 
      if (sqlStatement != null) 
      { 
        sqlStatement.close(); 
        throw SQLe; 
      } 
    } 

...
Рейтинг: 0 / 0
09.04.2013, 09:29:44
    #38218195
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
Библиотеки с сайта oracle.com
ojdbc6_g.jar
xdb6.jar


Самое странно во всем это вот что :

в sqldeveloper 'e - когда я вызываю эти функции - то я получаю результат .

Код: plsql
1.
select EMPLOYEE_PACKAGE.EMPLOYEE_LIST_TYPES() from DUAL;



в ответ я получаю то что должен :

Код: plsql
1.
{<EMPLOYEE_TYPE=admin>,<EMPLOYEE_TYPE=user>,<EMPLOYEE_TYPE=Anonymous>,}



в вот создать свою функцию я еще не пробовал.

при этом из кода этот же ответ я получить не могу , точнее получаю OracleResultSetImpl

по вот как вытащить из него результат , мне не понятно.

Тем более, мне бы хотелось сразу получить ответ в виде объектов , чтобы использовать из в своей модели .


Второй вопрос , который у меня возник сегодня - это как работать из

EntityManager'a с таблицами оракл , если в именах таблиц есть символ #


EMPLOYEE_TABLES.T$EMPLOYEE#TYPES имя таблицы в которой хранятся типы

EMPLOYEE_LIST_TYPES

при попытки вызвать nativequery -

Код: java
1.
2.
3.
       String sql = "select TYPES_CODE from EMPLOYEE_TABLES.T$EMPLOYEE#TYPES";
       Query q = getEntityManager().createNativeQuery(sql);
       List result = q.getResultList();



в строке q.getResultList() я получаю ошибку времени исполнения - т.к. символ # используется для определения параметра для запроса .

Как быть ?


самое быстрое решение мне видится в том что можно как то получить от getEntityManager() - обычный connection - и дальше уже использовать его ?

или можно как то экранировать # в именах таблиц !?
...
Рейтинг: 0 / 0
09.04.2013, 10:28:18
    #38218295
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
Atum1в вот создать свою функцию я еще не пробовал.
-попробуй
2. я так понял доступ к БД есть, значит там можно сделать синонимы таблиц и экранировать #
...
Рейтинг: 0 / 0
09.04.2013, 23:13:08
    #38219573
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
Petro123Atum1в вот создать свою функцию я еще не пробовал.
-попробуй
2. я так понял доступ к БД есть, значит там можно сделать синонимы таблиц и экранировать #


DDL команды не доступны , только DML
...
Рейтинг: 0 / 0
10.04.2013, 20:02:35
    #38220980
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAVA call Oracle procedure
Atum1,
Ящик остался на работе, поэтому пишу тут.
- поставь свой тестовый сервер. Могу дать по шагам установку.
Такое извратное имхо API не часто встретишь.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JAVA call Oracle procedure / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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