2015-04-16 153 views
1

我讀下面一個循環中,從數據庫中的幾個SQL查詢:DB2 SQL錯誤代碼-245約會

{ // start of loop 
Map<String, Object> queryRS = this.jdbcTemplate.queryForMap(this.querySql,queryParam); 
String query = (String) queryRS.get("QUERY"); 

// code here as explained below 

} // end of loop 

查詢返回的可以有任意數量的參數。然而,在他們所有的我必須設置相同的日期作爲參數。

爲此,我計算查詢中字符?的出現次數,並創建一個Object數組,其日期重複如下。

String date = '2010-12-31'; 
int numArgs = StringUtils.countMatches(query, "?"); 
String[] paramArgs = new String[numArgs]; 
for (int i = 0; i < numArgs; i++) { 
     paramArgs[i] = date; 
} 

在這之後,我執行如下查詢:

SqlRowSet myRowSet = this.jdbcTemplate.queryForRowSet(query,(Object[]) paramArgs); 

然而,這是給錯誤時,查詢有一個Date(?)功能。

com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-245, SQLSTATE=428F5, SQLERRMC=DATE;1, DRIVER=3.64.96 

上述錯誤的描述是:

An untyped parameter marker is passed to a function and there are two or more possible candidate functions to resolve to during function resolution. 

如何解決這個?

感謝您的閱讀!

回答

0

我想你正在使用字符串jdbcTemplate。

我不一樣,但有一個類似的問題:功能是char(?)和我是 傳遞一個整數參數給它。
我使用舊的框架Ibatis 2.x(現在我使用MyBatis 3.x)。 該框架不是錯誤原因。
在Ibatis上,我通過了這樣的說法:char(#value:INTEGER#)
在我的開發服務器上,所有工作都很好,但在遠程生產服務器上,我得到了同樣的錯誤。

該問題是由JDBC驅動程序版本4.x在生產的開發端1.x引起的。
爲了解決我的問題,我有兩種方法:

  • 改變生產驅動程序(但我不能)
  • 使用不同的呼叫:char('$value:INTEGER$')(我這樣做)

在IBATIS/MyBatis的框架,如果價值是123,char('$value:INTEGER$')是轉換爲sql char('123')所以解決我的問題,當生產更改驅動程序我可以放回到char(#value:INTEGER#)

你也有類似的問題。嘗試:

我不使用JdbcTemplate的直接訪問,但我認爲你沒有把ARGS在字符串中,你必須創建一個Date變量結束把它放在一個Object數組中。

我希望這可以幫助你。