Не удалось получить доступ к параметру OUT хранимой процедуры

Сейчас мы пытаемся использовать хранимую процедуру из нашего Java-кода через Toplink, но, похоже, у нас есть проблема, на которую я не смог найти ответ. Возможно, в этом случае мой Google-Fu подводит меня.

Наша проблема заключается в том, что, хотя процедура выглядит корректно, мы ничего не получаем в ответ на Java-код. Рассматриваемая процедура была протестирована из SQLDeveloper с теми же входными параметрами, и процедура возвращает значения, как и должна.

Сигнатура процедуры

create or replace PACKAGE FORM_METADATA AS
  PROCEDURE FORM_LIST_GET (
      P_USER_ID IN VARCHAR2,
      P_CHANNEL_NO IN NUMBER,
      P_START_FROM IN NUMBER, --pagination
      P_COUNT_TO_RETURN IN NUMBER,  --pagination
      P_GET_TOTAL_COUNT IN NUMBER, -- if total count should be returned then 1, other wise 0
      P_RESULT_SET OUT  SYS_REFCURSOR,
      P_TOTAL_COUNT OUT NUMBER);
end FORM_METADATA;

Код Java, вызывающий эту процедуру, выглядит следующим образом: BigDecimal count = new BigDecimal(-1);

Session session = getSession();
session.setLog(new OutputStreamWriter(System.out));
session.setLogLevel(SessionLog.FINEST);
StoredProcedureCall procedureCall = new StoredProcedureCall();
procedureCall.setProcedureName("FORM_METADATA.FORM_LIST_GET");
procedureCall.addNamedArgumentValue("P_USER_ID", "UserID-1");
procedureCall.addNamedArgumentValue("P_CHANNEL_NO", new BigDecimal(1));
procedureCall.addNamedArgumentValue("P_START_FROM", new BigDecimal(1));
procedureCall.addNamedArgumentValue("P_COUNT_TO_RETURN", new BigDecimal(1000));
procedureCall.addNamedArgumentValue("P_GET_TOTAL_COUNT", new BigDecimal(1));

procedureCall.useNamedCursorOutputAsResultSet("P_RESULT_SET");
procedureCall.addNamedOutputArgument("P_TOTAL_COUNT", "count", BigDecimal.class);

DataReadQuery dq = new DataReadQuery();
dq.setCall(procedureCall);
dq.prepareForExecution();

Object result = session.executeQuery(dq);
System.out.println("Result:: " + result);
System.out.println("Result from StoredProcedreCall: " + procedureCall.getResult());

Вывод, который мы получаем, выглядит следующим образом:

[TopLink Warning]: 2015.08.31 16:11:30.781--Failed to get InitialContext for MBean registration: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
[TopLink Warning]: 2015.08.31 16:11:30.797--Failed to get InitialContext for MBean registration: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
[TopLink Info]: 2015.08.31 16:11:31.685--DatabaseSessionImpl(1827000661)--TopLink, version: Oracle TopLink - 11g Release 1 (11.1.1.5.0) (Build 110305)
[TopLink Info]: 2015.08.31 16:11:34.147--DatabaseSessionImpl(1827000661)--dev login successful
[TopLink Finest]: 2015.08.31 16:11:34.147--DatabaseSessionImpl(1827000661)--Thread(Thread[main,5,main])--Execute query DataReadQuery()
[TopLink Finest]: 2015.08.31 16:11:34.163--DatabaseSessionImpl(1827000661)--Thread(Thread[main,5,main])--reconnecting to external connection pool
[TopLink Fine]: 2015.08.31 16:11:34.227--DatabaseSessionImpl(1827000661)--Connection(1635575430)--Thread(Thread[main,5,main])--BEGIN FORM_METADATA.FORM_LIST_GET(P_USER_ID=>?, P_CHANNEL_NO=>?, P_START_FROM=>?, P_COUNT_TO_RETURN=>?, P_GET_TOTAL_COUNT=>?, P_RESULT_SET=>?, P_TOTAL_COUNT=>?); END;
  bind => [UserID-1, 1, 1, 1000, 1, => P_RESULT_SET, => P_TOTAL_COUNT]
Result:: []
Result from StoredProcedreCall: null
Process exited with exit code 0.

Я почти уверен, что наша проблема связана с вызовом процедуры Java-кодом, но, как я уже сказал, мы пока не смогли найти правильного решения. Кто-нибудь может подсказать, где мы должны начать искать дальше?

Заранее спасибо,
Мика


Обновлять:

Моему коллеге удалось найти причину, по которой процедура ничего не вернула. Для краткости я отредактировал пару параметров, которые мы не использовали в данном случае и которые, по нашему мнению, не являются причиной воспринимаемого поведения. Однако, поскольку параметры были обязательными, они были установлены в NULL. Мой коллега подумал попробовать инициализировать параметры без значения и после этого запрос вернул ожидаемый набор данных.

Таким образом, наше изменение кода (в Java) должно было перейти от

procedureCall.addNamedArgumentValue("P_ORDER_BY", OracleTypes.NULL);

to

procedureCall.addNamedArgument("P_ORDER_BY");

Теперь мы получаем данные от курсора, как и ожидалось, но значение второго параметра out по-прежнему ускользает от нас.


person mlein    schedule 31.08.2015    source источник


Ответы (1)


После более тщательного поиска доступа ко второму выходному параметру мы нашли эту тему на форумах Oracle, которая привела к нужное нам решение.

person mlein    schedule 31.08.2015