使用:

  • Spring Boot 1.4.0.RELEASE
  • JPA:2.1
  • 休眠:5.0.9
  • 休眠方言:org.hibernate.dialect.Oracle10gDialect
  • Oracle数据库: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调试输出,它将生成的sql调用显示为{call mySp(?,?)}

    这似乎...令人生畏(因为它不包含指定名称的提示),但我知道它可能只是在进行内部翻译时处于休眠状态?

    如果我将存储的proc设置更改为使用位置参数,则该操作确实有效,但我确实更喜欢使用命名参数。

    存储的过程规范:
    PROCEDURE mySp (param1 IN tdocs.transactiontype_id%TYPE,
    outParam OUT tdocs.doc_id%TYPE );

    最佳答案

    这似乎是Hibernate 5.0.9中的错误。对我来说,切换到Hibernate 5.0.11.Final可以达到目的,没有其他更改。

    感谢Mihai Cicu在评论中指出了这个方向。

    07-24 09:49
    查看更多