【问题标题】:"Ordinal binding and Named binding" issue when calling Stored Procedure with Jpa 2.1使用 Jpa 2.1 调用存储过程时出现“序数绑定和命名绑定”问题
【发布时间】:2017-01-08 00:38:50
【问题描述】:

使用:

  1. Spring Boot 1.4.0.RELEASE
  2. JPA:2.1
  3. 休眠:5.0.9
  4. 休眠方言:org.hibernate.dialect.Oracle10gDialect
  5. Oracle 数据库:12.1.0.2
  6. 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 );

【问题讨论】:

  • 能否将 PL/SQL 过程 mySp() 的规范添加到您的问题中?
  • 生成的sql很奇怪。 Oracle 不支持将问号作为绑定变量占位符。我看起来在 JDBC 级别上也发生了一些事情。
  • @MartinSchapendonk SP 规范已添加,可能物有所值。
  • @ibre5041 对于日志记录来说似乎很正常。仍然不确定这里发生了什么。规范与代码恕我直言匹配。谷歌搜索只建议用序数绑定替换 sigh
  • @demaniak 不知何故,在升级到 spring boot 1.5.1、hibernate 5.2.8 并从 ojdbc6 切换到 7 后问题似乎消失了,同时使用相同的方言(10g)和命名参数:)

标签: java oracle hibernate stored-procedures jpa-2.1


【解决方案1】:

这似乎是 Hibernate 5.0.9 中的一个错误。对我来说,切换到 Hibernate 5.0.11.Final 就成功了,没有其他变化。

感谢 Mihai Cicu 在 cmets 中指出这个方向。

【讨论】:

  • 开始看起来答案是“升级”:)
猜你喜欢
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 2014-12-14
  • 2015-07-26
  • 2012-08-19
  • 1970-01-01
  • 2019-05-15
  • 2020-05-21
相关资源
最近更新 更多