1

我正在尝试使用 Spring JDBC 执行 SQL 函数。

我的代码是

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; SQL [{? = 调用 RATELIMIT_OWN.GET_LOGS()}]; SQL 状态 [99999];错误代码 [17041];索引处缺少 IN 或 OUT 参数:: 1; 嵌套异常是 java.sql.SQLException: Missing IN or OUT parameter at index:: 1 at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83) at 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) 在 org.springframework。 jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:

我不明白为什么它会抛出这个错误。对于准备好的语句,我们声明输入和输出参数并编译它们。但是对于函数,当我们将它作为 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() 这个数组列表,所有值都是空的。

任何原因?

4

2 回答 2

2

您需要添加

.withoutProcedureColumnMetaDataAccess()

到您的 SimpleJdbcCall。

于 2014-08-20T12:19:17.767 回答
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));
于 2012-09-06T16:25:48.670 回答