Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите с вызовом. Не получается хоть убей... :( / 3 сообщений из 3, страница 1 из 1
15.01.2012, 12:16:28
    #37615053
Virtual Student
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с вызовом. Не получается хоть убей... :(
В базе данных Oracle есть хранимая процедура следующего вида:

Код: plsql
1.
CREATE PROCEDURE GET_COUNTS_1 (CCODE varchar2, CDATE DATE, COUNT_ALL IN OUT INTEGER, COUNTS_LIST IN OUT SYS_REFCURSOR)



Второй день сражаюсь и не могу ее вызвать. Потренировался на простеньких процедурах собственного производства, а с этой ничего не выходит! :( Впадаю в отчаяние...
Работаю в JDeveloper с использованием JPA TopLink. В сессионном бине доступен только EntityManager em, который инжектится.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
        
        String ccode = "10";
        int count = 0;
        java.util.Date udate = new java.util.Date(); 
        long lMilliSecs = udate.getTime(); 
        java.sql.Date sdate = new java.sql.Date(lMilliSecs);

        StoredProcedureCall spc =  new StoredProcedureCall();
        spc.setProcedureName("GET_COUNTS_1");
        spc.addNamedArgumentValue("CCODE", ccode);
        spc.addNamedArgumentValue("CDATE", sdate);
        spc.addNamedInOutputArgumentValue("COUNT_ALL", count, "COUNT_ALL", Integer.class);
        spc.addNamedInOutputArgumentValue("COUNTS_LIST", null, "COUNTS_LIST", ResultSet.class);
        ValueReadQuery q = new ValueReadQuery();
        try {
            q.setCall(spc);
            if (!q.isPrepared()) {
                q.prepareForExecution();
            }
            q.executeDatabaseQuery();
        } catch (Exception e) {
            e.printStackTrace();
        }



При вызове выдает сообщение:
Exception Description: Unprepared SQLCall StoredProcedureCall(GET_COUNTS_1) attempted translation; nested exception is: Exception [TOPLINK-7119] (Oracle TopLink - 11g Release 1 (11.1.1.5.0) (Build 110305)): oracle.toplink.exceptions.ValidationException

Помогите пожалуйста!.. Как правильно вызывать?
...
Рейтинг: 0 / 0
16.01.2012, 05:47:10
    #37615653
Kostya Ilyinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с вызовом. Не получается хоть убей... :(
Virtual Student,

Оговорюсь сразу - не работал с топлинк. начните с простого примера - попробуйте вызвать процедуру из sqlplus. Возможно, процедура не откомпилирована (некорректна) - по-крайней мере из вывода sqlplus будет понятно, есть ли проблемы с самой процедурой. А там уже гугл вам в помощь и вперед!
...
Рейтинг: 0 / 0
16.01.2012, 12:04:30
    #37615927
sanBez
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с вызовом. Не получается хоть убей... :(
Virtual Student,

С топлинком работал давно, уже почти забыл. Заранее извиняюсь за возможные ошибки.
Попробуйте:
1. Не ValueReadQuery, а DataReadQuery (у вас два значения возвращается, а в ValueRead если я не ошибаюсь одно)
2. Не помню зачем, у меня для storedProcedureCall стоит типа spc.setUsesBinding(true)
3. После q.setCall у меня дополнительно стоит q.addArgument("CCODE") q.addArgument("CDATE") - в общем для всех входных аргументов
4. Результат запроса вытаскивать из карты по ключам - имя параметра

Короче. Мой код, который работает:


Код: 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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
       StoredProcedureCall call = new StoredProcedureCall();
        call.setProcedureName("rutown.ПАК_МОЩНОСТЬ.НАЙТИ_МАКС_МОЩН_ДИАП");
        Vector args = new Vector();
        // входные параметры
        call.addNamedArgument("ПЕРИОД");
        args.addElement(apbucodeI);
        call.addNamedArgument("АКТИВНАЯ");
        args.addElement(etypeactI);
        call.addNamedArgument("ПРЯМАЯ");
        args.addElement(etypedirectI);
        call.addNamedArgument("УЧИТЫВАТЬ_ЗНАК");
        args.addElement(signI);
        call.addNamedArgument("ТИП_МАКСИМУМА");
        args.addElement(maxtypeI);
        call.addNamedArgument("ДЛЯ_КОГО");
        args.addElement(for_whatI);
        call.addNamedArgument("КОД_ПОТР");
        args.addElement(pob);
        call.addNamedArgument("ТАРИФНАЯ_ГРУППА");
        args.addElement(tg);
        call.addNamedArgument("С_ДАТЫ");
        args.addElement(dbeg);
        call.addNamedArgument("ПО_ДАТУ");
        args.addElement(dend);
        call.addNamedArgument("ИСКАТЬ_В_ПЗ");
        args.addElement(pzI);
        // выходные параметры
        call.addNamedOutputArgument("МОЩНОСТЬ", "МОЩНОСТЬ", Double.class);
        call.addNamedOutputArgument("ДАТА_МОЩНОСТИ", "ДАТА_МОЩНОСТИ", 
                                    Timestamp.class);

        call.setUsesBinding(true);

        DataReadQuery query = new DataReadQuery();
        query.setCall(call);
        query.addArgument("ПЕРИОД");
        query.addArgument("АКТИВНАЯ");
        query.addArgument("ПРЯМАЯ");
        query.addArgument("УЧИТЫВАТЬ_ЗНАК");
        query.addArgument("ТИП_МАКСИМУМА");
        query.addArgument("ДЛЯ_КОГО");
        query.addArgument("КОД_ПОТР");
        query.addArgument("ТАРИФНАЯ_ГРУППА");
        query.addArgument("С_ДАТЫ");
        query.addArgument("ПО_ДАТУ");
        query.addArgument("ИСКАТЬ_В_ПЗ");

        try {
            Object result = session.executeQuery(query, args);

            Map map = (Map)((Vector)result).firstElement();
            return new MaxPower((Date)((Timestamp)map.get("ДАТА_МОЩНОСТИ")), 
                                (Double)map.get("МОЩНОСТЬ"));
        } catch (Exception e) {
             ....
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите с вызовом. Не получается хоть убей... :( / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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