2014-09-23 96 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'); 

当然,后者假定您的会话被配置为使用英语(否则三字母缩写会有所不同) 。如果您正在构建可能由具有非英语会话设置的个人访问的应用程序,则使用数字月份通常更有意义。