【问题标题】:Incorrect Ordinal binding and Named binding cannot be combined exception不正确的序数绑定和命名绑定不能组合异常
【发布时间】:2016-04-18 11:15:44
【问题描述】:

我有一个 spring 数据存储库,它调用一个使用命名查询定义的过程。存储过程有两个参数,第一个是 ref_cursor,第二个是参数。这是 sp 签名:

create or replace procedure proc1(out_pos out sys_refcursor , pTrans_ID in Number) is  ............

这也是实体上的命名查询定义:

@javax.persistence.NamedStoredProcedureQuery(name = "getProc", procedureName = "proc1",
        parameters ={
                @StoredProcedureParameter(name = "out_pos",mode = ParameterMode.REF_CURSOR,type = void.class),
                @StoredProcedureParameter(name = "pTrans_ID",mode = ParameterMode.IN,type = Long.class)
        }
)

这是调用命名查询的存储库:

public interface TempReportRepository extends SwiftRepository<TempReportEntity,Long> {
    @Procedure(name = "getProc")
    public Object[] getProc1(@Param("pTrans_ID") Long inParam1);


}

当我调用getProc1below 时会引发异常:

Caused by: java.sql.SQLException: operation not allowed: Ordinal binding and Named binding cannot be combined!
    at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:10093)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:5693)
    at org.hibernate.result.internal.OutputsImpl.<init>(OutputsImpl.java:69)
    ... 72 more

【问题讨论】:

  • 不是答案,也不是一个好的工作,但我通过删除参数名称(和 @Param 注释)摆脱了这个问题,然后确保参数顺序火柴。这不是很好,但它有效。

标签: java jdbc spring-data sys-refcursor ref-cursor


【解决方案1】:

如果你使用的是 eclipselink 见https://bugs.eclipse.org/bugs/show_bug.cgi?id=440078

似乎您必须使用 EntityManager::createStoredProcedureQuery 显式创建 StoredProcedureQuery

【讨论】:

    【解决方案2】:

    尝试序数绑定

    实体上的命名存储过程查询:

    @NamedStoredProcedureQueries({
        @NamedStoredProcedureQuery(name = "getProc",
                procedureName = "proc1",
                resultClasses = TempReportEntity.class,
                parameters = {
                        @StoredProcedureParameter(mode = ParameterMode.IN,  type = Long.class),
                        @StoredProcedureParameter(mode = ParameterMode.REF_CURSOR,type = void.class)
                })})
    

    调用函数

    private final EntityManager entityManager;
    public PurchaseOrderDetailsRepo( EntityManager entityManager) {
            this.entityManager = entityManager;
        }
    public List<TempReportEntity> getProc1(Long pTrans_ID){
        StoredProcedureQuery query = entityManager.createNamedStoredProcedureQuery("getProc");
            query.setParameter(1,eid);
            query.execute();
        List<TempReportEntity> result = query.getResultList();
        return result;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 2021-06-22
      相关资源
      最近更新 更多