powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите с вызовом. Не получается хоть убей... :(
3 сообщений из 3, страница 1 из 1
Помогите с вызовом. Не получается хоть убей... :(
    #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
Помогите с вызовом. Не получается хоть убей... :(
    #37615653
Kostya Ilyinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Virtual Student,

Оговорюсь сразу - не работал с топлинк. начните с простого примера - попробуйте вызвать процедуру из sqlplus. Возможно, процедура не откомпилирована (некорректна) - по-крайней мере из вывода sqlplus будет понятно, есть ли проблемы с самой процедурой. А там уже гугл вам в помощь и вперед!
...
Рейтинг: 0 / 0
Помогите с вызовом. Не получается хоть убей... :(
    #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
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите с вызовом. Не получается хоть убей... :(
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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