当我执行下面的代码时,我在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更多
答案 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);
希望这对您有帮助!