Java JDBC过程调用

时间:2010-12-07 10:15:07

标签: java oracle jdbc call procedure

我有一个oracle过程,它将日期作为参数,并由两个不同的Java Web应用程序调用,在我从过去的日期使用to_char(date, 'd')提取日期的过程中。我无法找出为什么一个应用程序返回的日期与其他应用程序不同。我正在为这两个应用程序使用相同的ojdbc驱动程序。它与这些应用程序运行的机器env变量有什么关系吗?

由于

3 个答案:

答案 0 :(得分:2)

这是因为一周的第一天在所有国家都不一样,例如在欧洲,一周的第一天是星期一,而在美国则是星期天。考虑:

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_TERRITORY。

答案 1 :(得分:1)

尝试在两个应用程序中检查JAVA / Oracle中的默认语言环境。

我认为它可能取决于JAVA中设置的默认语言环境。

答案 2 :(得分:1)

尝试在启动它们时通过传递-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();
    }