2012-09-06 39 views
0

我正在尝试使用Spring JDBC执行SQL函数。Spring JDBC和Oracle函数问题

我的代码是

SimpleJdbcCall caller = new SimpleJdbcCall(this.jdbcTemplateRandOnline).withCatalogName("RATELIMIT_OWN").withFunctionName("Get_Logs"); 
RateLimitLogBean resultBean = null; 
SqlParameterSource paramMap = new MapSqlParameterSource().addValue(P_YYYYMM, inputBean.getMonth(), Types.VARCHAR).addValue(P_NUMEC, inputBean.getNumec(), Types.INTEGER); 
resultBean = caller.executeFunction(RateLimitLogBean.class, paramMap); 

但是当我运行这段代码,我得到以下错误

org.springframework.jdbc.UncategorizedSQLException:CallableStatementCallback;未分类SQLException for SQL [{? = call RATELIMIT_OWN.GET_LOGS()}]; SQL状态[99999];错误代码[17041];在index :: 1处缺少IN或OUT参数; 嵌套的异常是java.sql.SQLException:在org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate上的index :: 1处缺少IN或OUT参数org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator上的 .translate(AbstractFallbackSQLExceptionTranslator.java:80)在org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1030)在org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1064)在有机springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:388)在org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:351)在org.springframework.jdbc.core.simple。 SimpleJdbcCall.executeFunction(SimpleJdbcCall.java:154)

我不明白为什么它会抛出这个错误。对于准备好的语句,我们声明输入和输出参数并对它们进行编译。但对于功能,怎能当我们把它当作SqlParamSource

SQL函数

FUNCTION RATELIMIT_OWN.Get_Logs (p_yyyymm VARCHAR2, p_numec NUMBER) 

这个函数返回类型

TYPE RATELIMIT_OWN.LOG_RECORD AS OBJECT 
    (EVENTID    VARCHAR2(15), 
    MSG     VARCHAR2(2000), 
    CREATE_DATE  DATE); 

我已经调试到Spring框架的记录编译。我发现,在

org.springframework.jdbc.core.metadata.CallMetaDataContext.reconcileParameters方法,我得到this.metaDataProvider.getCallParameterMetaData()将此ArrayList的所有值都为空。

的原因吗?

+0

你可以分享你的Sql函数的原型吗? –

+0

加入SQL函数 – Reddy

回答

1

您必须声明函数的参数,可以类似的东西:

SimpleJdbcCall caller = new SimpleJdbcCall(this.jdbcTemplateRandOnline) 
              .withCatalogName("RATELIMIT_OWN") 
              .withFunctionName("Get_Logs") 
              .withReturnValue() 
              .declareParameters(
               new SqlParameter("p_yyyymm",java.sql.Types.VARCHAR)) 
              .declareParameters(
               new SqlParameter("p_numec",java.sql.Types.INTEGER)); 
+0

我像你说的添加,我仍然得到同样的错误 – Reddy

+0

我已经调试到Spring框架。我发现,在 org.springframework.jdbc.core.metadata.CallMetaDataContext.reconcileParameters方法,我得到this.metaDataProvider.getCallParameterMetaData()将此ArrayList的所有值都为空。 任何理由? – Reddy

0

您需要添加

.withoutProcedureColumnMetaDataAccess() 

要将SimpleJdbcCall时。