2014-09-23 458 views
1

我想運行一個Oracle存儲過程,並將結果作爲數據源傳遞給java web應用程序中的報表。我使用的是Spring MVC,我的操作系統是Windows 7- 32bit。Oracle日期轉換錯誤ORA-01858

的代碼是這樣的:

DataSource ds = jdbcTemplate.getDataSource(); 
Connection conn = ds.getConnection(); 
CallableStatement cs = conn.prepareCall(report.getStoredSQL()); 

... preparing the parameters... 

cs.registerOutParameter(7, oracle.jdbc.OracleTypes.CURSOR); 
cs.execute(); 
ResultSet resultSet = (ResultSet)cs.getObject(outputParamNumber); 

rs = new CachedRowSetImpl(); 
rs.populate(resultSet); 

然後我通過RS我的報告。

當我去我的控制面板 - >區域和語言選項 - >格式,並將其設置爲英語(美國),一切工作正常,但如果我將它設置爲英語(加拿大),我會得到這個異常時執行這一行:

rs.populate(resultSet); 

這是例外:

[22/09/14 14:13:25:166 EDT] 00000076 SystemErrřjava.sql.SQLDataException:ORA-01858:非 - 數字字符被發現的地方預計數字 ORA-06512:在「IBMS.PK_COT_BLD_REPORTS」,行4913

這是我的存儲過程的第4913行:d_CutOffDate Date:='1-jan-2004';

是否可以配置Oracle會話的格式,使其不依賴操作系統設置?

感謝您的幫助提前。

回答

2

不要依賴隱式數據類型轉換。如果您要聲明date,請使用日期。或者使用日期文字或通過顯式轉換

d_CutOffDate Date := date '2004-01-01'; 

d_CutOffDate Date := to_date('1-jan-2004', 'DD-MON-YYYY'); 

當然,後者假定您的會話被配置爲使用英語(否則三字母縮寫會有所不同) 。如果您正在構建可能由具有非英語會話設置的個人訪問的應用程序,則使用數字月份通常更有意義。