我正在尝试运行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会话的格式,以便它不依赖于操作系统设置?
提前感谢您的帮助。
答案 0 :(得分:2)
不要依赖隐式数据类型转换。如果您要声明date
,请使用日期。使用日期文字或通过显式转换
d_CutOffDate Date := date '2004-01-01';
或
d_CutOffDate Date := to_date( '1-jan-2004', 'DD-MON-YYYY' );
当然,后者假设您的会话配置为使用英语(否则三个字母的缩写将不同)。如果您正在构建可能由具有非英语会话设置的个人访问的应用程序,则使用数字月份通常更有意义。