EclipseLink - проблема новичка в вызове хранимой процедуры Oracle - PullRequest
0 голосов
/ 29 декабря 2010

Я отвечаю за задачу, которая, на мой взгляд, должна быть простой, но, поскольку я никогда не выполнял ее раньше, у меня возникли некоторые проблемы с ней. Я успешно создал проект EJB 3, используя EclipseLink, который будет вызывать ряд хранимых процедур из базы данных Oracle. Я правильно настроил источник данных, я могу подключаться и выполнять простые хранимые процедуры и функции (без параметров и возврата курсора); однако в настоящее время я не могу выполнить хранимые процедуры с параметрами.

Я использую вики EclipseLink для справки http://wiki.eclipse.org/Using_Basic_Query_API_(ELUG).

Код:

StoredProcedureCall call = new StoredProcedureCall();
call.setProcedureName("p_environment.startSession");

List<String[]> args = new ArrayList<String[]>();
args.add(new String[] { "user", "ae01403" });
args.add(new String[] { "application", "app_code" });
args.add(new String[] { "locale", "it_IT" });

for (String[] pair : args) {
    call.addNamedArgumentValue(pair[0], pair[1]);
}

DataReadQuery query = new DataReadQuery(call);
for (String[] pair : args) {
    query.addArgument(pair[0]);
}

На основании документации базы данных, поскольку у меня нет доступа к самой базе данных, процедура принимает 3 параметра VARCHAR IN с указанным именем. Затем я вызываю метод executeQuery в активном сеансе, но получаю ошибку «Неверный тип или количество аргументов». Что я делаю неправильно? Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: подпись хранимой процедуры, в соответствии с документацией, является:

p_environment.startSession(as_user        IN VARCHAR2, 
                           as_application IN VARCHAR2, 
                           as_locale      IN VARCHAR2);

Большое спасибо!

1 Ответ

0 голосов
/ 29 декабря 2010

В вашем коде call.addNamedArgumentValue(pair[0], pair[1]); звучит странно.

Вам не нужно делать это вместо этого?

call.addNamedArgument(procedureParameterName, argumentFieldName, argumentType);

Включает отображение параметров хранимой процедуры и аргументов, которые вы хотите использовать.

Например, для вас это дает:

call.addNamedArgument(procedureUserParameterName, "user", String.class);
call.addNamedArgument(procedureUserParameterName, "application", String.class);
call.addNamedArgument(procedureUserParameterName, "locale", String.class);

Вы держите это:

DataReadQuery query = new DataReadQuery(call);
for (String[] pair : args) {
    query.addArgument(pair[0]);
}

Затем для вызова вашей хранимой процедуры:

Session session = jpaEntityManager.getActiveSession();
List args = new ArrayList();
args.add(“ae01403”);
args.add(“app_code”);
args.add(“it_IT”);
List results = (List) session.executeQuery(query, args);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...