引起:org.hibernate.exception.GenericJDBCException:要求dialect注册ref cursor参数[5]

时间:2017-05-18 22:09:06

标签: java spring oracle jpa stored-procedures

当我执行下面的代码时,我在spq.execute()行上遇到以下错误。你能给我一些关于什么是错的提示吗?

StoredProcedureQuery spq = emOracle.createStoredProcedureQuery("SDBANCO.PRC_CNS_SLD_JUD_BLOQ_DESBLOQ");
    spq.registerStoredProcedureParameter(1, BigDecimal.class, ParameterMode.IN);
    spq.registerStoredProcedureParameter(2, BigDecimal.class, ParameterMode.IN);
    spq.registerStoredProcedureParameter(3, BigDecimal.class, ParameterMode.IN);
    spq.registerStoredProcedureParameter(4, String.class, ParameterMode.IN);
    spq.registerStoredProcedureParameter(5, Class.class, ParameterMode.REF_CURSOR);

    // set input parameter
    spq.setParameter(1, BigDecimal.valueOf(Long.parseLong(agencia)));
    spq.setParameter(2, BigDecimal.valueOf(Long.parseLong(conta)));
    spq.setParameter(3, BigDecimal.valueOf(Long.parseLong(codigoBloqueioLegado)));
    spq.setParameter(4, cpfCnpj);

    BloqueioJudicial bloqueioJudicial = null;
    try{
        if (spq.execute()) {
            bloqueioJudicial = (BloqueioJudicial) spq.getSingleResult();
            return bloqueioJudicial.getSaldoBloqueado();
        }
    } catch (NoResultException nre) {
        return new BigDecimal(0);
    }

    return new BigDecimal(0);

错误:

  

引起:org.hibernate.exception.GenericJDBCException:错误要求方言注册引用游标参数[5]       在org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)       在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)       在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)       在org.hibernate.engine.jdbc.cursor.internal.StandardRefCursorSupport.registerRefCursorParameter(StandardRefCursorSupport.java:60)       在org.hibernate.procedure.internal.AbstractParameterRegistrationImpl.prepare(AbstractParameterRegistrationImpl.java:347)       在org.hibernate.procedure.internal.ProcedureCallImpl.buildOutputs(ProcedureCallImpl.java:402)       在org.hibernate.procedure.internal.ProcedureCallImpl.getOutputs(ProcedureCallImpl.java:363)       在org.hibernate.jpa.internal.StoredProcedureQueryImpl.outputs(StoredProcedureQueryImpl.java:234)       在org.hibernate.jpa.internal.StoredProcedureQueryImpl.execute(StoredProcedureQueryImpl.java:217)       at br.com.company.juridico.repository.impl.CartNetRepositoryImpl.consultarSaldoBloqueadoContaProduto(CartNetRepositoryImpl.java:155)       at br.com.company.juridico.repository.impl.CartNetRepositoryImpl $$ FastClassBySpringCGLIB $$ 60a23375.invoke()       在org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)       在org.springframework.aop.framework.CglibAopProxy $ CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:721)       在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)       at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)       ......还有98个   引起:java.sql.SQLException:列类型无效:-99       at oracle.jdbc.driver.OracleStatement.getInternalType(OracleStatement.java:4188)       at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:129)       at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:326)       at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:574)       at oracle.jdbc.driver.OracleCallableStatementWrapper.registerOutParameter(OracleCallableStatementWrapper.java:1585)       在org.jboss.jca.adapters.jdbc.CachedCallableStatement.registerOutParameter(CachedCallableStatement.java:153)       在org.jboss.jca.adapters.jdbc.WrappedCallableStatement.registerOutParameter(WrappedCallableStatement.java:1168)       在org.hibernate.dialect.Oracle8iDialect.registerResultSetOutParameter(Oracle8iDialect.java:552)       在org.hibernate.engine.jdbc.cursor.internal.StandardRefCursorSupport.registerRefCursorParameter(StandardRefCursorSupport.java:57)       ... 109更多

2 个答案:

答案 0 :(得分:0)

首先尝试声明ref_cursor。

StoredProcedureQuery spq = emOracle.createStoredProcedureQuery("SDBANCO.PRC_CNS_SLD_JUD_BLOQ_DESBLOQ");
spq.registerStoredProcedureParameter(1, Class.class, ParameterMode.REF_CURSOR);
spq.registerStoredProcedureParameter(2, BigDecimal.class, ParameterMode.IN);
spq.registerStoredProcedureParameter(3, BigDecimal.class, ParameterMode.IN);
spq.registerStoredProcedureParameter(4, BigDecimal.class, ParameterMode.IN);
spq.registerStoredProcedureParameter(5, String.class, ParameterMode.IN);

CREATE OR REPLACE PROCEDURE SDBANCO.PRC_CNS_SLD_JUD_BLOQ_DESBLOQ( 
            PRESULT OUT SYS_REFCURSOR, 
            PNR_AGENCIA IN NUMBER, 
            PNR_CONTA IN NUMBER, 
            PNR_CODBLOQUEIOJUD IN NUMBER, 
            PVCH_CPFCNPJ IN VARCHAR2)
AS

答案 1 :(得分:0)

检查Oracle库是否在应用程序类路径中,并使用OracleTypes.class像这样:

spq.registerStoredProcedureParameter(5, OracleTypes.class ,ParameterMode.REF_CURSOR);

希望这对您有帮助!