【问题标题】:Spring JDBC and Oracle Function issuesSpring JDBC 和 Oracle 函数问题
【发布时间】:2012-08-31 07:54:26
【问题描述】:

我正在尝试使用 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) 在 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: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() 这个数组列表,所有值都是空的。

有什么原因吗?

【问题讨论】:

  • 可以分享一下你的Sql Function的原型吗?

标签: sql oracle spring function


【解决方案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));

【讨论】:

  • 我已经按照你说的添加了,但我仍然遇到同样的错误
  • 我已经调试到Spring框架。我发现,在 org.springframework.jdbc.core.metadata.CallMetaDataContext.reconcileParameters 方法中,我得到 this.metaDataProvider.getCallParameterMetaData() 这个数组列表,所有值都是空的。有什么原因吗?
【解决方案2】:

你需要添加

.withoutProcedureColumnMetaDataAccess()

到您的 SimpleJdbcCall。

【讨论】:

  • 无论有没有其他解决方案,这个解决方案都对我有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多