Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC过程调用_Java_Oracle_Jdbc_Call_Procedure - Fatal编程技术网

Java JDBC过程调用

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

我有一个oracle过程,它将日期作为参数,并由两个不同的Java web应用程序调用,在该过程中,我使用
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。