Вызов процедуры Java JDBC - PullRequest
       26

Вызов процедуры Java JDBC

2 голосов
/ 07 декабря 2010

У меня есть оракулярная процедура, которая принимает дату в качестве параметра и вызывается двумя различными веб-приложениями Java, в рамках процедуры, которую я извлекаю за день, используя to_char(date, 'd') из прошедшей даты.Я не могу выяснить, почему день, возвращаемый одним приложением, отличается от другого.Я использую один и тот же драйвер ojdbc для обоих приложений.Имеет ли это какое-либо отношение к переменной env машины, на которой работают эти приложения?

Спасибо

Ответы [ 3 ]

2 голосов
/ 07 декабря 2010

это потому, что первый день недели не одинаков во всех странах, например, в Европе первый день недели - понедельник, а в США - воскресенье.Обратите внимание:

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 голос
/ 07 декабря 2010

Попробуйте явно указать часовой пояс в обоих контейнерах веб-приложений, передав им аргумент -Duser.timezone="America/New_York" VM (отрегулируйте в соответствии с потребностями вашего часового пояса) при запуске.

Чтобы ответить на ваш комментарий, на уровне приложения вы можете явно указать желаемый часовой пояс при вызове хранимого процесса. Например:

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();
    }
1 голос
/ 07 декабря 2010

попробуйте проверить локаль по умолчанию в JAVA / Oracle в обоих приложениях.

Я думаю, что это может зависеть от локали по умолчанию, установленной в JAVA.

...