Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите вызвать хранимую процедуру Oracle / 25 сообщений из 26, страница 1 из 2
13.01.2012, 16:29:21
    #37613464
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
По всему проекту использую JDev + Oracle + EJB.
Возникла необходимость вызвать хранимую процедуру с параметрами, один из которых ссылка на курсор (REF IN OUT SYS_REFCURSOR).

Код: java
1.
2.
3.
4.
5.
6.
        
        Query q = em.createNativeQuery("call D_CALCULATE(?,?)");
        String code = "FFFF";
        q.setParameter(1, ccode);

        q.executeUpdate();



Вот что нужно вместо второго параметра подставить?
Примеры смотрел - в основном все jdbc напрямую используют...
...
Рейтинг: 0 / 0
13.01.2012, 16:36:02
    #37613487
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
Проще добратся до Connection и вызвать нормально через CallableStatement
http://docs.oracle.com/cd/B25329_01/doc/appdev.102/b25108/xedev_jdbc.htm#BABDGEDA
...
Рейтинг: 0 / 0
13.01.2012, 16:39:34
    #37613498
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
BlazkowiczПроще добратся до Connection и вызвать нормально через CallableStatement
http://docs.oracle.com/cd/B25329_01/doc/appdev.102/b25108/xedev_jdbc.htm#BABDGEDA
Согласен, а как через EntityManager добраться до Connection? Не подскажете?
...
Рейтинг: 0 / 0
13.01.2012, 16:45:43
    #37613515
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
По-моему достаточно просто DataSource заинжектить и получить connection. Он должен быть связан с текущей транзакцией. Большего и не нужно. Если тупой сервер не может выдать правильный connection, тогда кастим EntityManager к его конкретной реализации и достаём оттуда.
...
Рейтинг: 0 / 0
13.01.2012, 16:47:01
    #37613518
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
BlazkowiczПо-моему достаточно просто DataSource заинжектить и получить connection. Он должен быть связан с текущей транзакцией. Большего и не нужно. Если тупой сервер не может выдать правильный connection, тогда кастим EntityManager к его конкретной реализации и достаём оттуда.
Вот нашел ответ на счет коннекта (для потомков):

Код: java
1.
2.
        
java.sql.Connection connection = em.unwrap(java.sql.Connection.class);
...
Рейтинг: 0 / 0
13.01.2012, 17:16:55
    #37613580
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
Вот нашел ответ на счет коннекта (для потомков):

Код: java
1.
2.
        
java.sql.Connection connection = em.unwrap(java.sql.Connection.class);

[/quot]

Сори - это не работает ! Зря время убил...
говорит:
Код: java
1.
2.
3.
4.
5.
javax.ejb.EJBException: EJB Exception: ; nested exception is: 
	java.lang.NoSuchMethodError: javax.persistence.EntityManager.unwrap(Ljava/lang/Class;)Ljava/lang/Object;; nested exception is: java.rmi.RemoteException: EJB Exception: ; nested exception is: 
	java.lang.NoSuchMethodError: javax.persistence.EntityManager.unwrap(Ljava/lang/Class;)Ljava/lang/Object;
	at weblogic.ejb.container.internal.RemoteBusinessIntfProxy.unwrapRemoteException(RemoteBusinessIntfProxy.java:124)
	at weblogic.ejb.container.internal.RemoteBusinessIntfProxy.invoke(RemoteBusinessIntfProxy.java:103)



Так может кто-нибудь знает как правильно через EJB вызвать хранимку? Ну или на счет извлечения Connection из EntityManager?
...
Рейтинг: 0 / 0
13.01.2012, 17:25:39
    #37613602
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
Virtual StudentТак может кто-нибудь знает как правильно через EJB вызвать хранимку?

EJB!=JPA. В EJB получаем connection из DataSource, который лежит в JNDI и вызываем спрок через JDBC.

Virtual StudentНу или на счет извлечения Connection из EntityManager?
https://www.google.com/search?q=get+connection+from+entity+manager
...
Рейтинг: 0 / 0
13.01.2012, 17:33:38
    #37613620
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
BlazkowiczVirtual StudentТак может кто-нибудь знает как правильно через EJB вызвать хранимку?

EJB!=JPA. В EJB получаем connection из DataSource, который лежит в JNDI и вызываем спрок через JDBC.

Virtual StudentНу или на счет извлечения Connection из EntityManager?
https://www.google.com/search?q=get+connection+from+entity+manager

Да, да - сорь - EJB!=JPA...
Ссылочку (слово в слово) я уже часа два вкуриваю. Так толком ничего и не нашел... :(
...
Рейтинг: 0 / 0
13.01.2012, 17:42:57
    #37613649
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
EntityManager.getDelegate() что возвращает?
Почему не хотите сделать через DataSource?
...
Рейтинг: 0 / 0
13.01.2012, 18:21:54
    #37613754
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
BlazkowiczEntityManager.getDelegate() что возвращает?
Возвращает Object (который представлен классом EntityManagerImpl)
Почему не хотите сделать через DataSource?[/quot]
Через DataSource? - имеется в виду через JNDI пул соединений?
...
Рейтинг: 0 / 0
13.01.2012, 18:26:29
    #37613762
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
Virtual StudentВозвращает Object (который представлен классом EntityManagerImpl)

В EntityManagerImpl разве нет ссылки на connection?

Virtual StudentЧерез DataSource? - имеется в виду через JNDI пул соединений?
Да. EntityManager получает свои соединения через этот самый пул.
...
Рейтинг: 0 / 0
13.01.2012, 18:36:43
    #37613773
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
BlazkowiczВ EntityManagerImpl разве нет ссылки на connection?


Неа...

Virtual StudentЧерез DataSource? - имеется в виду через JNDI пул соединений?
BlazkowiczДа. EntityManager получает свои соединения через этот самый пул.
Это я понимаю, но как до него (соединения) достучаться..?
...
Рейтинг: 0 / 0
13.01.2012, 18:52:29
    #37613810
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
Virtual StudentНеа...

Какой JPA провайдер? Toplink?

Virtual StudentЭто я понимаю, но как до него (соединения) достучаться..?
Заинжектить, так же как и EM.
...
Рейтинг: 0 / 0
13.01.2012, 18:56:05
    #37613817
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
Virtual Student , да у вас вообще то и строка вызова не совсем корректна:

Код: java
1.
Query q = em.createNativeQuery("{call D_CALCULATE(?,?)}");



Обратите внимание на { } . А так, все ок. Должно отлично работать через EntityManager. Для красивости, конечно, лучше сделать named-native-query и положить его в orm.xml...
...
Рейтинг: 0 / 0
13.01.2012, 18:58:57
    #37613822
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
P.S. Самого главного то и не спросил... А что вы делаете в процедуре с SYS_REFCURSOR?
...
Рейтинг: 0 / 0
13.01.2012, 19:02:17
    #37613827
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
Ruslan.IsbarovP.S. Самого главного то и не спросил... А что вы делаете в процедуре с SYS_REFCURSOR?
А это не я делаю... Это другой дядька делал на PL/SQL. Нужно тупо забрать данные.
А вообще там расчет всякой фигни по базе делается...
...
Рейтинг: 0 / 0
13.01.2012, 19:03:00
    #37613832
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
Ruslan.IsbarovА так, все ок. Должно отлично работать через EntityManager. Для красивости, конечно, лучше сделать named-native-query и положить его в orm.xml...
...
Рейтинг: 0 / 0
13.01.2012, 19:03:29
    #37613833
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
Ruslan.IsbarovА так, все ок. Должно отлично работать через EntityManager. Для красивости, конечно, лучше сделать named-native-query и положить его в orm.xml...
и как там OUT-параметр зарегать?
...
Рейтинг: 0 / 0
13.01.2012, 19:08:11
    #37613839
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
Ruslan.Isbarov Virtual Student , да у вас вообще то и строка вызова не совсем корректна:

Код: java
1.
Query q = em.createNativeQuery("{call D_CALCULATE(?,?)}");



Обратите внимание на { } . А так, все ок. Должно отлично работать через EntityManager. Для красивости, конечно, лучше сделать named-native-query и положить его в orm.xml...

Меня главный образом волнует вопрос как принять выходной параметр типа ссылки на курсор. В примерах показано, как через обычные соединения можно сделать. Но так, как я стараюсь изучать новые фишки EJB, JPA и т.п., очень хочется узнать как тоже самое можно и нужно делать при помощи JPA.
У меня к Вам пламенная просьба Ruslan.Isbarov если не трудно, напишите как правильно вызвать нужно процедуру и забрать возвращаемый параметр в виде ссылки на курсор...
Предполагаю, что ссылка будет выглядеть как ResultSet... Или я не прав?
...
Рейтинг: 0 / 0
13.01.2012, 19:11:28
    #37613845
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
Virtual Student ,

Вы какой JPA-провайдер используете? Вот пример для Hibernate.

В orm.xml

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
...
<named-native-query name="dCalculate" result-set-mapping="dCalculateResult">
    <query>
        <![CDATA[
            {call D_CALCULATE(?, :ccode)}
        ]]>
    </query>
    <hint name="org.hibernate.callable" value="true" />
</named-native-query>
...
<sql-result-set-mapping name="dCalculateResult">
    // Зависит от решаемой задачи, например
    // <column-result name="MY_RESULT_COL_1"/>
    // <column-result name="MY_RESULT_COL_2"/>
    ...
</sql-result-set-mapping>
...


Вызов:

Код: java
1.
2.
3.
4.
5.
Query query = em.createNamedQuery("dCalculate");
query.setParameter("ccode", "FFFF");

@SuppressWarnings("unchecked")
List<Object[]> results = query.getResultList();
...
Рейтинг: 0 / 0
13.01.2012, 19:16:50
    #37613853
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
BlazkowiczRuslan.Isbarov...
и как там OUT-параметр зарегать?
А зачем? С SYS_REFCURSOR Hibernate прекрасно умеет работать. Вам даже не нужно задавать значение параметра, как в примере выше.
...
Рейтинг: 0 / 0
13.01.2012, 19:17:47
    #37613854
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
Ruslan.Isbarov Virtual Student ,
Вы какой JPA-провайдер используете? Вот пример для Hibernate.

У меня "навязывается" TopLink. В целом меня устраивает, просто я пока новичек в этом деле...

Вот нашел еще пример извлечения соединения:

Код: java
1.
Connection cn = ((oracle.toplink.essentials.ejb.cmp3.EntityManager)em).getServerSession().getDefaultConnectionPool().acquireConnection().getConnection();            



Но, сохранился вопрос! В каком пакете лежит этот:
Код: java
1.
oracle.toplink.essentials.ejb.cmp3.EntityManager

класс?
Кто в курсе?
...
Рейтинг: 0 / 0
13.01.2012, 19:28:02
    #37613871
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
Virtual Student,

Используйте либо:

1. Через EntityManager.
2. Через oracle.toplink.queryframework.StoredProcedureCall с жесткой привязкой к TopLink.
3. Через DataSource.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
@Resource(name="jdbc/myds") // Здесь нужно указать JNDI-имя вашего DataSource.
private DataSource ds;

...

Connection connection = ds.getConnection();
CallableStatement callableStatement = connection.prepareCall(...);
callableStatement.registerOutParameter(2, OracleTypes.CURSOR);
...
Рейтинг: 0 / 0
14.01.2012, 00:05:16
    #37614174
dominator
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
Virtual Student,

Очень удобно вызывать с использованием Spring. Я как раз недавно делал. Нужно просто инжектировать в сервис DataSource и потом создать шаблон для вызова процедуры. Всю работу по получению коннекта и обработке исключений делает шаблон.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class JdbcActorDao implements ActorDao {
    private SimpleJdbcTemplate simpleJdbcTemplate;
    private SimpleJdbcCall funcGetActorName;

    public void setDataSource(DataSource dataSource) {
        this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        jdbcTemplate.setResultsMapCaseInsensitive(true);
        this.funcGetActorName =
                new SimpleJdbcCall(jdbcTemplate)
                        .withFunctionName("get_actor_name");
    }

    public String getActorName(Long id) {
        SqlParameterSource in = new MapSqlParameterSource()
                .addValue("in_id", id); 
        String name = funcGetActorName.executeFunction(String.class, in);
        return name;
    }

    //  ... additional methods
}



http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/jdbc.html#jdbc-simple-jdbc-call-3
...
Рейтинг: 0 / 0
14.01.2012, 17:49:25
    #37614579
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите вызвать хранимую процедуру Oracle
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
StoredProcedureCall call = new StoredProcedureCall();
call.setProcedureName("CHECK_VALID_POSTAL_CODE");
call.addNamedArgument("POSTAL_CODE");
call.addNamedOutputArgument(
    "IS_VALID",    // procedure parameter name
    "IS_VALID",    // out argument field name
    Integer.class  // Java type corresponding to type returned by procedure
);
ValueReadQuery query = new ValueReadQuery();
query.setCall(call);
query.addArgument("POSTAL_CODE");
Vector parameters = new Vector();
parameters.addElement("L5J1H5");
Number isValid = (Number) session.executeQuery(query,parameters);


Люди, а что в данном случае session ?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите вызвать хранимую процедуру Oracle / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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