2012-09-06 38 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時。