Oracle日期转换错误ORA-01858

时间:2014-09-23 18:30:08

标签: java sql oracle jdbc

我正在尝试运行Oracle存储过程并将结果作为数据源传递给java Web应用程序中的报表。我正在使用spring MVC,我的操作系统是Windows 7-32位。

代码是这样的:

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 R java.sql.SQLDataException:ORA-01858:找到一个非数字字符,其中数字是预期的 ORA-06512:在“IBMS.PK_COT_BLD_REPORTS”,第4913行

这是我的存储过程的第4913行:d_CutOffDate Date:='1-jan-2004';

是否可以配置Oracle会话的格式,以便它不依赖于操作系统设置?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

不要依赖隐式数据类型转换。如果您要声明date,请使用日期。使用日期文字或通过显式转换

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

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

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