我正在尝试运行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' );


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

10-07 19:34
查看更多