我正在尝试运行Oracle存储过程,并将结果作为数据源传递给Java Web应用程序中的报表。我正在使用spring MVC,我的操作系统是Windows 7- 32bit。
代码是这样的:
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:='2004年1月1日';
是否可以为Oracle会话配置格式,使其不依赖于操作系统设置?
感谢您的帮助。
最佳答案
不要依赖隐式数据类型转换。如果要声明date
,请使用日期。使用日期文字或通过显式转换
d_CutOffDate Date := date '2004-01-01';
要么
d_CutOffDate Date := to_date( '1-jan-2004', 'DD-MON-YYYY' );
当然,后者假定您的会话配置为使用英语(否则,三个字母的缩写会有所不同)。如果您要构建的应用程序可由具有非英语会话设置的个人访问,则使用数字月份通常更有意义。