Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вызов хранимой функции из бина / 14 сообщений из 14, страница 1 из 1
06.03.2012, 21:08:16
    #37694296
rus_sun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой функции из бина
Ни разу не пробовал, но знаю что можно.
Есть хранимая функция на Oracle - myFunction(Date startDate, Date endDate). Возвращает список скалярных значений.
Вызываю ее из бина
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
...
@In
EntityManager em;
...
List<Object[]> resultList = (List<Object[]>)em.createNativeQuery("{? = call myFunction(:startDate,:endDate)}")
.setParameter("startDate", start)
.setParameter(""endDate",end)
.getResultList();



Все ли я правильно делаю? Особенно беспокоит возвращаемое значение.
...
Рейтинг: 0 / 0
06.03.2012, 22:55:49
    #37694389
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой функции из бина
rus_sunНи разу не пробовал, но знаю что можно.
Есть хранимая функция на Oracle - myFunction(Date startDate, Date endDate). Возвращает список скалярных значений.
Вызываю ее из бина
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
...
@In
EntityManager em;
...
List<Object[]> resultList = (List<Object[]>)em.createNativeQuery("{? = call myFunction(:startDate,:endDate)}")
.setParameter("startDate", start)
.setParameter(""endDate",end)
.getResultList();



Все ли я правильно делаю? Особенно беспокоит возвращаемое значение.

А, что не работает?

Тоже разбирался недавно с вызовом процедуры, - толком не получалось... Потом сделал вот так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    @Resource(name = "jdbc/DBConn")  // Соответственно DataSource
    private DataSource ds;

    public int callSendEmail(String fld, String act)  {
        Connection conn;
        try {
            conn = ds.getConnection();
            CallableStatement cs = conn.prepareCall("BEGIN DOCALC(?,?,?); END;");
            cs.setString(1, addr);
            cs.setString(2, subj);
            cs.registerOutParameter(3, OracleTypes.INTEGER); // INOUT PARAMETER
            cs.execute();
            Integer result = cs.getInt(3);
            return result;
        } catch (SQLException e) {
            e.printStackTrace();
            return 0;
        }
    }


Так точно работает! У меня в проекте используется сейчас...
...
Рейтинг: 0 / 0
07.03.2012, 09:20:55
    #37694700
GKS_Samara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой функции из бина
Добрый день, rus_sun!

> Есть хранимая функция на Oracle - myFunction(Date startDate, Date
> endDate). Возвращает список скалярных значений.

Полную сигнатуру функции дай.

> List<Object[]> resultList = (List<Object[]>)em.createNativeQuery("{? = call myFunction(:startDate,:endDate)}")

Query можно применять, только если эту функцию можно записать в
select'е. Иначе нужно использовать CallableStatement.
Для этого инъектится DataSource и вперёд.

> Все ли я правильно делаю? Особенно беспокоит возвращаемое значение.

Если это pipeline то одно, если коллекция- то вот даже не знаю- не
приходилось из явы использовать.

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.03.2012, 11:24:48
    #37694878
rus_sun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой функции из бина
GKS_Samara,
спасибо, за помощь.
Вот моя хранимая функция, это select

Код: 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.
39.
40.
41.
create or replace function mttIncommingReport1(startDate Date, endDate Date)
RETURN SYS_REFCURSOR is

    mtt_cursor SYS_REFCURSOR;
begin
  OPEN mtt_cursor FOR
  
select to_char(с.db, 'HH:MI:SS') "Время", dcc.call_duration_sek(с.id) "Длительность, сек",
 s3.lname "Оператор", m.bn "Входящий номер", m.memo "Регион", s1.memo "Клиент", s2.memo "ФЛ/ЮЛ", s3.memo "Тип разговора",
 s4.t_memo "Тема", s4.pt_memo "Подтема", с.an "Номер абонента"
from dcc.callcard с, dcc.vbn b, vs.mtt_noms m,
       (select c.id id, ct.memo memo 
        from dcc.callcard c, dcc.call_theme ct, dcc.theme t, dcc.vbn b
        where c.id=ct.id and ct.idt=t.idt and t.memo like 'Тип клиента%' and c.bn=b.cbn
         and b.bn in (21,22,23,24,25,26) and c.db>=startDate and c.db<=endDate) s1,
       (select c.id id, ct.memo memo 
        from dcc.callcard c, dcc.call_theme ct, dcc.theme t, dcc.vbn b
        where c.id=ct.id and ct.idt=t.idt and t.memo like 'Тип контакта%' and c.bn=b.cbn 
        and b.bn in (21,22,23,24,25,26) and c.db>=startDate and c.db<=endDate) s2,
        (select c.id id, ct.memo memo, o.lname lname
        from dcc.callcard c, dcc.call_theme ct, dcc.theme t, dcc.vbn b, dcc.operator o
        where c.id=ct.id and ct.idt=t.idt and t.memo like 'Тип разговора%' and c.bn=b.cbn
         and b.bn in (21,22,23,24,25,26) and o.ido=ct.ido and c.db>=startDate and c.db<=endDate) s3,          
        (select c.id, ss1.memo t_memo,ss2.memo pt_memo
         from dcc.callcard c, dcc.vbn b,
            (select c.id id, t.memo tmemo, ct.memo memo, t.idt idt 
            from dcc.callcard c, dcc.call_theme ct, dcc.theme t, dcc.vbn b
            where c.id=ct.id and ct.idt=t.idt and t.memo like 'Тема %' and c.bn=b.cbn 
            and b.bn in (21,22,23,24,25,26) and c.db>=startDate and c.db<=endDate) ss1,
            (select c.id id, t.memo tmemo, ct.memo memo, t.idtp idtp 
            from dcc.callcard c, dcc.call_theme ct, dcc.theme t, dcc.vbn b
            where c.id=ct.id and ct.idt=t.idt and t.memo like 'Подтема %' and c.bn=b.cbn 
            and b.bn in (21,22,23,24,25,26) and c.db>=startDate and c.db<=endDate) ss2
        where c.bn=b.cbn and b.bn in (21,22,23,24,25,26) and c.db>=startDate and c.db<=endDate
        and c.id=ss1.id and c.id=ss2.id and ss1.idt=ss2.idtp) s4
where с.bn=b.cbn(+) and b.bn in (21,22,23,24,25,26) and substr(с.bn,2,10)=m.transfer_nom(+) 
and с.id=s1.id(+) and с.id=s2.id(+) and с.id(+)=s3.id and с.id=s4.id(+) 
order by с.id, s4.t_memo;
 
      RETURN ( mtt_cursor);
end mttIncommingReport1;
...
Рейтинг: 0 / 0
07.03.2012, 12:35:56
    #37695051
rus_sun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой функции из бина
Virtual Student,
спасибо за помощь, если не добьюсь , чтобы мое заработало, сделаю как у Вас.
А пока у меня вот такой stacktrace

Код: xml
1.
2.
3.
 Hibernate:    { ? = call olg.mttincommingreport1(?,?)}
WARN  [org.hibernate.util.JDBCExceptionReporter] (http-127.0.0.1-8080-2) SQL Error: 17041, SQLState: null
ERROR [org.hibernate.util.JDBCExceptionReporter] (http-127.0.0.1-8080-2) В индексе отсутствует параметр IN или OUT:: 3



думаю это он на мой знак вопроса ругается, надо видимо туда подставлять какой-то параметр.
...
Рейтинг: 0 / 0
07.03.2012, 12:51:16
    #37695088
GKS_Samara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой функции из бина
Добрый день, rus_sun!

> create or replace function mttIncommingReport1(startDate Date, endDate Date)
> RETURN SYS_REFCURSOR is

Не понимаю, что в яве можно сделать с рефкурсором. Т.е. может можно, но
я считаю это невозможным :)

Поэтому я б написал pipelined функцию и получал бы данные select'ом.

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.03.2012, 12:55:43
    #37695105
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой функции из бина
GKS_Samarapipelined функцию
всё равно будет хранимка, т.е. в Java не заметим разницы.
...
Рейтинг: 0 / 0
07.03.2012, 13:47:46
    #37695235
GKS_Samara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой функции из бина
Добрый день, Petro123!

> pipelined функцию
> всё равно будет хранимка, т.е. в Java не заметим разницы.

Между pipelined и select'ом- да, не заметит :)

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.03.2012, 13:16:00
    #37696384
rus_sun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой функции из бина
GKS_Samara

Поэтому я б написал pipelined функцию и получал бы данные select'ом.

--
Алексей
JID: alxt@ya.ru


Был бы очень благодарен за пример.
...
Рейтинг: 0 / 0
11.03.2012, 08:40:47
    #37698366
GKS_Samara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой функции из бина
Добрый день, rus_sun!

> Был бы очень благодарен за пример.

Все столбцы из запроса переписывать лень, поэтому сделаю для примера
запроса двух колонок.
В pl/sql:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE OR REPLACE TYPE TEST_OBJ as object (
  field1 varchar2(2000),
  field2 number);

CREATE OR REPLACE TYPE TEST_TABLE is table of TEST_OBJ;

create or replace function mttIncommingReport1_table(startDate Date,
endDate Date) return TEST_TABLE pipelined is
  vRes TEST_OBJ;
begin
  for x in (.....) loop
    vRes := TEST_OBJ('Тест', 123);
    pipe row (vRes);
  end loop;
  return;
end;

select field1, field2
from table(cast(mttIncommingReport1_table as TEST_TABLE(sysdate, sysdate))



В яве дальше просто делаешь селект как из таблицы с текстом выше.

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.03.2012, 08:43:00
    #37698367
GKS_Samara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой функции из бина
Добрый день!

Вот что копипаст делает :)

Так правильнее:
Код: sql
1.
2.
select field1, field2
from table(cast(mttIncommingReport1_table(sysdate, sysdate) as TEST_TABLE)



--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.03.2012, 15:46:27
    #37723316
rus_sun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой функции из бина
Короче сделал вот так и работает на ура.

Определю NamedQuery в orm.xml

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<named-native-query name="kpiQuery" result-set-mapping="kpiQueryResult">
        <query>
        <![CDATA[
            {call olg.mtt_total_stat(?, :startDate,:endDate,:delta,:grp1,:grp2,:grp3)}
        ]]>
        </query>
        <hint name="org.hibernate.callable" value="true" />
    </named-native-query>
    
    <sql-result-set-mapping name="kpiQueryResult">
    </sql-result-set-mapping>



Затем в бине вызываю его

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
@PersistenceContext//(type=EXTENDED)
    private EntityManager em;

.......

@SuppressWarnings("unchecked")
        ArrayList<Object[]> resultList = (ArrayList<Object[]>) em.createNamedQuery("kpiQuery")
                .setParameter("startDate", filterStartDate)
                .setParameter("endDate", filterEndDate)   
                .setParameter("delta", delta)
                .setParameter("grp1", selectedGroupList.isEmpty() ? true : selectedGroupList.contains("1")) 
                .setParameter("grp2", selectedGroupList.isEmpty() ? true : selectedGroupList.contains("2")) 
                .setParameter("grp3", selectedGroupList.isEmpty() ? true : selectedGroupList.contains("3")) 
                .getResultList();
...
Рейтинг: 0 / 0
26.03.2012, 15:48:16
    #37723319
rus_sun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой функции из бина
Как альтенатива NamedQuery можно еще задавать в аннотациях к Entity бинам
Например, вот так

Код: 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.
@NamedNativeQueries({
@NamedNativeQuery(name = "hourQuery", 
        query = "{call olg.mtt_total_stat_req(?, :startDate,:endDate,:delta,:grp1,:grp2,:grp3)}",
        resultSetMapping="hourQueryResult", 
        hints = { @javax.persistence.QueryHint(name = "org.hibernate.callable", value = "true") }),
@NamedNativeQuery(name = "operatorQuery", 
        query = "{call olg.MTT_OPER_WORK_STAT(?, :startDate,:endDate,:delta,:grp1,:grp2,:grp3)}",
        resultSetMapping="operatorQueryResult", 
        hints = { @javax.persistence.QueryHint(name = "org.hibernate.callable", value = "true") }), 
@NamedNativeQuery(name = "themeQuery", 
        query = "{ ? = call olg.mttincommingreport1(:startDate,:endDate)}",
        resultSetMapping="themeQueryResult", 
        hints = { @javax.persistence.QueryHint(name = "org.hibernate.callable", value = "true") }),
@NamedNativeQuery(name = "dayQuery", 
        query = "{ ? = call olg.mttdayreport(:startDate,:endDate,:grp1,:grp2,:grp3)}",
        resultSetMapping="dayQueryResult", 
        hints = { @javax.persistence.QueryHint(name = "org.hibernate.callable", value = "true") }),
@NamedNativeQuery(name = "operatorNoteQuery", 
        query = "{ ? = call olg.mttoperatornotereport(:startDate,:endDate)}",
        resultSetMapping="operatorNoteQueryResult", 
        hints = { @javax.persistence.QueryHint(name = "org.hibernate.callable", value = "true") }),
@NamedNativeQuery(name = "regionQuery", 
        query = "{ ? = call olg.mttregionreport(:startDate,:endDate,:grp1,:grp2,:grp3)}",
        resultSetMapping="regionQueryResult", 
        hints = { @javax.persistence.QueryHint(name = "org.hibernate.callable", value = "true") }) 
})
@SqlResultSetMappings({
@SqlResultSetMapping(name="hourQueryResult"),
@SqlResultSetMapping(name="operatorQueryResult"),
@SqlResultSetMapping(name="themeQueryResult"),
@SqlResultSetMapping(name="dayQueryResult"),
@SqlResultSetMapping(name="operatorNoteQueryResult"),
@SqlResultSetMapping(name="regionQueryResult")
})

@Entity
@Table(name = "CALLCARD")
...
Рейтинг: 0 / 0
26.03.2012, 15:49:45
    #37723320
rus_sun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов хранимой функции из бина
Для уточнения у меня Seam приложение (EJB 3, Hibernate), AS Jboss 5, DB Oracle
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вызов хранимой функции из бина / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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