Использование:"Порядковый связывания и Названный связывания" вопрос при вызове хранимой процедуры с JPA 2.1
- Spring бутсу 1.4.0.RELEASE
- JPA: 2,1
- Hibernate: 5.0.9
- Hibernate Диалект:
org.hibernate.dialect.Oracle10gDialect
- Oracle Database: 12.1.0.2
- Oracle JDBC: ojdbc7 12.1.3-0-0
В сущности, когда я пытаюсь выполнить хранимую процедуру, я столкнулся с этой ошибкой:
operation not allowed: Ordinal binding and Named binding cannot be combined!
Полный трассировки стека выглядит следующим образом:
2016-08-31 13:35:37.906+0200 | APP | WARN | MvcAsync1 | o.h.e.j.s.SqlExceptionHelper | SQL Error: 17090, SQLState: 99999
2016-08-31 13:35:37.907+0200 | APP | ERROR | MvcAsync1 | o.h.e.j.s.SqlExceptionHelper | operation not allowed: Ordinal binding and Named binding cannot be combined!
2016-08-31 13:35:37.909+0200 | APP | ERROR | http-nio-8081-exec-3 | o.a.c.c.C.[.[.[.[dispatcherServlet] | Servlet.service() for servlet dispatcherServlet threw exception
java.sql.SQLException: operation not allowed: Ordinal binding and Named binding cannot be combined!
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:5626)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1385)
at org.hibernate.result.internal.OutputsImpl.<init>(OutputsImpl.java:52)
at org.hibernate.procedure.internal.ProcedureOutputsImpl.<init>(ProcedureOutputsImpl.java:32)
at org.hibernate.procedure.internal.ProcedureCallImpl.buildOutputs(ProcedureCallImpl.java:411)
at org.hibernate.procedure.internal.ProcedureCallImpl.getOutputs(ProcedureCallImpl.java:363)
at org.hibernate.jpa.internal.StoredProcedureQueryImpl.outputs(StoredProcedureQueryImpl.java:234)
at org.hibernate.jpa.internal.StoredProcedureQueryImpl.execute(StoredProcedureQueryImpl.java:217)
at com.mycomp.services.DocumenServiceImpl.addNewDoc(DocumentServiceImpl.java:88)
at com.mycomp.backend.rest.CreateController.lambda$0(CreateController.java:39)
at org.springframework.web.context.request.async.WebAsyncManager$4.run(WebAsyncManager.java:316)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.lang.Thread.run(Thread.java:745)
код вызова выглядит следующим образом:
StoredProcedureQuery sp = em.createStoredProcedureQuery("mySp")
.registerStoredProcedureParameter("param1", Integer.class, ParameterMode.IN)
.registerStoredProcedureParameter("outParam", Integer.class, ParameterMode.OUT)
.setParameter("param1", request.getTransactiontypeId());
sp.execute();
Включение SQL-debug outpu t, он показывает сгенерированный вызов sql как {call mySp(?,?)}
.
Это кажется ... изворотливым (поскольку он не содержит намека на указанные имена), но я понимаю, что это может быть просто спящий режим, выполняющий внутренние переводы?
ЕСЛИ Я изменил сохраненную процедуру proc, чтобы вместо этого использовать позиционные параметры, все на самом деле работает, но я бы предпочел использовать именованные параметры.
ХП Спецификация:
PROCEDURE mySp (param1 IN tdocs.transactiontype_id%TYPE,
outParam OUT tdocs.doc_id%TYPE );
Не могли бы вы добавить спецификацию процедуры PL/SQL 'mySp()' к вашему вопросу? –
Сгенерированный sql нечетный. Oracle не поддерживает вопросительные знаки в качестве заполнителей переменных привязки. Похоже, что что-то происходит на уровне JDBC. – ibre5041
@MartinSchapendonk SP spec добавлен, для чего это может стоить. – demaniak