2015-08-31 2 views
1

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

Наша проблема заключается в том, что, хотя процедура, кажется, правильно вызвана, мы ничего не возвращаем в код 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 подсчитывать = новый 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, ссылающегося на процедуру, но как я уже сказал, мы не смогли найти правильное решение. У кого-нибудь есть указатель на то, где мы должны начать смотреть дальше?

Спасибо заранее,
Mika


Update:

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

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

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

в

procedureCall.addNamedArgument("P_ORDER_BY"); 

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

ответ

0

После более целенаправленного поиска доступа к второму параметру out мы нашли this thread на форумах Oracle, которые приводят к нуждам, которое нам нужно.

Смежные вопросы