"Binding fix and name binding" when calling a stored procedure using Jpa 2.1

Using:

  • Spring Download 1.4.0.RELEASE
  • JPA: 2.1
  • Sleep Mode: 5.0.9
  • Hibernate Dialog: org.hibernate.dialect.Oracle10gDialect
  • Oracle Database: 12.1.0.2
  • Oracle JDBC: ojdbc7 12.1.3-0-0

In essence, when I try to execute a stored procedure, I encountered this error:

operation not allowed: Ordinal binding and Named binding cannot be combined!

A full stack trace is as follows:

    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)

The calling code is as follows:

    StoredProcedureQuery sp = em.createStoredProcedureQuery("mySp")
    .registerStoredProcedureParameter("param1", Integer.class, ParameterMode.IN)                
    .registerStoredProcedureParameter("outParam", Integer.class, ParameterMode.OUT)
    .setParameter("param1", request.getTransactiontypeId());
    sp.execute();

Turning on SQL debugging output, it shows the generated sql call as {call mySp(?,?)}.

It seems ... dodgy (since it doesn't have a hint of the names indicated), but I understand that it could just be a sleep mode that does internal translations?

proc, , , .

proc:

PROCEDURE mySp (param1 IN tdocs.transactiontype_id%TYPE,
outParam OUT tdocs.doc_id%TYPE );

+4
1

Hibernate 5.0.9. Hibernate 5.0.11.Final - .

Mihai Cicu , .

0

Source: https://habr.com/ru/post/1653146/


All Articles