EclipseLink: неверное количество или типы аргументов, вызывающих хранимую процедуру - PullRequest
0 голосов
/ 21 февраля 2011

Я использую EclipseLink для веб-проекта, включающего EJB 3 и хранимые процедуры Oracle. Мы все еще в начале, поэтому у меня была настроена простая процедура для тестирования, вот подпись:

p_test.testProcedure(as_param in varchar2)

Вот код, который я использую для вызова процедуры, аналогично статье Использование Basic Query API в Eclipsepedia:

JpaEntityManager jem = (JpaEntityManager) em.getDelegate();

StoredProcedureCall call = new StoredProcedureCall();
call.setProcedureName("p_test.testProcedure");

call.addNamedArgument("param", "param", String.class);

DataReadQuery query = new DataReadQuery();
query.setCall(call);

query.addArgument("param", String.class);

Vector<String> values = new Vector<String>();
values.add("test");

jem.getActiveSession().executeQuery(query, values);

Я получаю эту ошибку:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.1.v20100817-r8050):
org.eclipse.persistence.exceptions.DatabaseException Internal Exception: 
java.sql.SQLException: ORA-06550: line 1, column 7: PLS-00306: wrong number or types of 
arguments in call to 'TESTPROCEDURE' ORA-06550: line 1, column 7: PL/SQL: Statement
ignored Error Code: 6550 Call: BEGIN p_test.testProcedure(param=>?); END; bind => [test] Query: DataReadQuery()

Я также пытался установить тип аргумента вызова в java.sql.Types.VARCHAR, но ни в коем случае, безрезультатно.

У кого-то есть идеи, что я делаю не так? Спасибо всем.

Ответы [ 3 ]

1 голос
/ 21 февраля 2011

Из документов TopLink

addNamedArgument

public void addNamedArgument(java.lang.String procedureParameterName,
                             java.lang.String argumentFieldName)

PUBLIC: определение аргумента для хранимой процедуры и имени поля / аргумента, которое будет замененоЭто.MethodParameterName - имя ожидаемого аргумента процедуры.ArgumentsFieldName - это имя поля или аргумента, которое будет использоваться для передачи в процедуру.Если эти имена совпадают (как обычно), этот метод может быть вызван с одним аргументом.

public void addNamedArgumentValue(java.lang.String procedureParameterName,
                                  java.lang.Object argumentValue)

 call.addNamedArgumentValue("param",(Object)values );
1 голос
/ 22 февраля 2011

Решено с использованием комбинации двух вышеупомянутых ответов и моего собственного ума.

Сначала я использовал addNamedArgumentValue asu, предложенный # 1.Во-вторых, я использовал правильное имя параметра процедуры, предложенное # 2.Наконец, я использовал jem.executeNonSelectingCall(call), и это сработало.(Также с параметрами OUT).

Таким образом, они оба получают голос!

1 голос
/ 21 февраля 2011

Похоже, что вы указали в методе addNamedArgument другое значение methodParameterName, отличное от того, которое указано в вашей хранимой процедуре, т. Е. "Param" против "as_param".Попробуйте изменить свою логику следующим образом:

call.addNamedArgument("as_param", "param", String.class);

Этот метод отображает имя параметра между тем, что используется в вашем вызове query.addParameter, и тем, что определено в хранимой процедуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...