Java JDBC过程调用
我有一个oracle过程,它将日期作为参数,并由两个不同的Java web应用程序调用,在该过程中,我使用Java JDBC过程调用,java,oracle,jdbc,call,procedure,Java,Oracle,Jdbc,Call,Procedure,我有一个oracle过程,它将日期作为参数,并由两个不同的Java web应用程序调用,在该过程中,我使用to_char(date,'d')从传递的日期提取日期。我无法找出为什么一个应用程序返回的日期与另一个不同。我对这两个应用程序使用相同的ojdbc驱动程序。它是否与这些应用程序运行的机器环境变量有关 谢谢尝试在两个应用程序中检查JAVA/Oracle中的默认语言环境 我认为这可能取决于JAVA中设置的默认区域设置。在启动webapp容器时,通过向它们传递-Duser.timezone=“Am
to_char(date,'d')
从传递的日期提取日期。我无法找出为什么一个应用程序返回的日期与另一个不同。我对这两个应用程序使用相同的ojdbc驱动程序。它是否与这些应用程序运行的机器环境变量有关
谢谢尝试在两个应用程序中检查JAVA/Oracle中的默认语言环境
我认为这可能取决于JAVA中设置的默认区域设置。在启动webapp容器时,通过向它们传递
-Duser.timezone=“America/New_York”
VM参数(根据您的时区需要进行调整),尝试显式指定两个webapp容器上的时区
为了处理您的评论,在应用程序级别,您可以在调用存储过程时显式指定所需的时区。例如:
CallableStatement statement = null;
Connection conn = null;
try {
conn = getYourConnection();
Calendar dbCal = new GregorianCalendar(YOUR_DATABASE_TIMEZONE);
String sql = "begin schema_name.package_name.stored_proc(var1=>?, " +
"var2=>?); end;";
statement = conn.prepareCall(sql);
statement.setInt(1, something);
statement.setTimestamp(2, yourDate.getTime(), dbCal);
statement.execute();
conn.commit();
} finally {
if (statement!=null) statement.close();
if (conn!=null) conn.close();
}
这是因为一周的第一天在所有国家都不一样,例如在欧洲,一周的第一天是星期一,而在美国是星期天。考虑:
SQL> select * from nls_session_parameters where parameter = 'NLS_TERRITORY';
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_TERRITORY AMERICA
SQL> select to_char(date '2010-12-07', 'D') from dual;
TO_CHAR(DATE'2010-12-07','D')
-----------------------------
3
SQL> alter session set nls_territory=FRANCE;
Session altered
SQL> select to_char(date '2010-12-07', 'D') from dual;
TO_CHAR(DATE'2010-12-07','D')
-----------------------------
2
如果需要,请在过程开始时设置会话参数NLS\U TERRITORY。我想你的意思是
to\u char(date,'d')
而不是sysdate(date,'d')
。你能发布过程的相关部分吗?谢谢Adam,你说得对。基本上,我只是对_char(date,'d')做了修改,就这样。然后你能添加一些你输入的日期和返回的值的例子吗?哟,阿比迪。文森特回答了你的问题。我想你应该把他的答案标记为确定答案。在我的网络应用程序中,我没有明确设置语言环境。Oracle中的默认设置是American。我发现这两台机器上的语言环境设置存在差异,其中一台机器根本没有设置语言,而两台机器都将LANG设置为LANG=en_GB.UTF-8@Dimitrisli我认为这会起到作用,但无论如何都有必要在上下文级别而不是tomcat级别进行更改。我的意思是,如果我可以通过context.xml(或其他什么)为一个应用程序设置它?@Abidi您可以在jdbc调用存储过程中指定希望在DB中保存日期的时区,我已经用一个示例编辑了注释。谢谢Dimitrisli,我仍然不明白为什么在两个不同的Web应用程序中运行相同的Java代码,并且两个Tomcat都使用相同的JVM参数,这会使Oracle从一个日期开始计算天数的方式不同。我建议首先确定这种不一致性的确切来源。调试两个应用程序,并在到达存储过程之前检查日期,以查看它们是否不同。如果是,那么差异就来自于应用程序的某个地方,所以从一开始就更仔细地调试这两个应用程序,以查看日期的差异。我同意这一点,但这两个应用程序都访问相同的数据库、架构和过程,并且天的结果不同。@abidi:这是一个会话参数:由客户端设置,不是DB。