ORA-01882: регион часового пояса не найден

#sql #oracle #oracle11g #oracle-sqldeveloper

#Oracle #jdbc #Часовой пояс

Вопрос:

Я обращаюсь к базе данных Oracle из приложения Java, когда я запускаю свое приложение, я получаю следующую ошибку:

java.sql.SQLException: ORA-00604: произошла ошибка при рекурсивном SQL уровня 1 ORA-01882: регион часового пояса не найден

Комментарии:

1. Расскажите нам о вашей среде, как вы запускаете свою Java?

2. Я запускаю Java-приложение в командной строке. 64-разрядная версия Windows 7, но Oracle DB работает на удаленном сервере Unix.

3. попробуйте добавить «-Duser.timezone=<YOUR_GMT>» в свою команду, не забудьте заменить <YOUR_GMT> на ваш GMT, т.е. -Duser.timezone=» 05:30″

Ответ №1:

Вы также можете попытаться проверить версию драйвера Oracle jdbc и базы данных Oracle. Только сегодня у меня возникла эта проблема при использовании ojdbc6.jar (версия 11.2.0.3.0) для подключения к серверу Oracle 9.2.0.4.0. Замена его на ojdbc6.jar версия 11.1.0.7.0 решила проблему.

Мне также удалось сделать ojdbc6.jar версия 11.2.0.3.0 подключается без ошибок, добавляя oracle.jdbc.timezoneAsRegion=false в файл oracle/jdbc/defaultConnectionProperties.properties (внутри jar). Нашел это решение здесь (неработающая ссылка)

Затем можно добавить -Doracle.jdbc.timezoneAsRegion=false в командную строку или AddVMOption -Doracle.jdbc.timezoneAsRegion=false в конфигурационные файлы, которые используют это обозначение.

Вы также можете сделать это программно, например, с System.setProperty помощью .

В некоторых случаях вы можете добавлять переменную среды для каждого соединения, если это разрешено (разработчик SQL разрешает это в «Расширенных» свойствах подключения; я проверил, что это работает при подключении к базе данных, у которой нет проблемы, и использовании ссылки на базу данных с базой данных, у которой есть).

Комментарии:

1. Мне также удалось сделать ojdbc6.jar версия 11.2.0.3.0 подключается без ошибок, добавив oracle.jdbc.timezoneAsRegion=false в файл oracle/jdbc/defaultConnectionProperties.properties (внутри jar). Нашел это решение здесь: forums.oracle.com/forums/thread.jspa?threadID=1095807

2. Наконец, можно добавить -Doracle.jdbc.timezoneAsRegion=false в командную строку или AddVMOption -Doracle.jdbc.timezoneAsRegion=false в конфигурационных файлах, которые используют это обозначение.

3. Спасибо stmsat. У меня это сработало. Я изменил свой jar ojdbc на версию 11.1.0.7.0 в каталоге tomcat / lib, и он начал работать :).

4. Я использую maven для сборки и упаковки (war) моего проекта и развертывания в Cloud Flare, можно ли каким-либо образом настроить это свойство из файла application.properties или из maven.

Ответ №2:

В простой установке SQL-разработчика под Windows перейдите в каталог

 C:Program Filessqldevelopersqldeveloperbin
  

и добавьте

 AddVMOption -Duser.timezone=CET
  

в файл sqldeveloper.conf .

Комментарии:

1. Используя Jetbrains DataGrip и столкнувшись с той же проблемой после добавления этой опции виртуальной машины, проблема была решена

2. Спасибо, это действительно очень помогло!

Ответ №3:

Ошибка, которую я получил :

Ошибка db_connection.java —>> java.sql.SQLException: ORA-00604: произошла ошибка при рекурсивном SQL уровня 1 ORA-01882: регион часового пояса не найден

ORA-00604: произошла ошибка на рекурсивном уровне SQL 1ORA-01882: регион часового пояса не найден

Предыдущий код:

  public Connection getOracle() throws Exception {
     Connection conn = null;
     Class.forName("oracle.jdbc.driver.OracleDriver");
     conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:tap", "username", "pw");
     return conn;
}
  

новый код:

  public Connection getOracle() throws Exception {
     TimeZone timeZone = TimeZone.getTimeZone("Asia/Kolkata");
     TimeZone.setDefault(timeZone);
     Connection conn = null;
     Class.forName("oracle.jdbc.driver.OracleDriver");
     conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:tap", "username", "pw");
     return conn;
}
  

теперь он работает!!

Комментарии:

1. Спасибо, это именно то, что мне было нужно!

2. Я не знаю, почему ему не понравился часовой пояс по умолчанию «Европа / Мадрид». Установка часового пояса по умолчанию на «GMT» работает.

Ответ №4:

Обновите файл oracle/jdbc/defaultConnectionProperties.properties в любой версии используемой библиотеки (т. Е. Внутри вашего jar), чтобы он содержал строку ниже:

 oracle.jdbc.timezoneAsRegion=false
  

Ответ №5:

Происходит то, что клиент JDBC отправляет идентификатор часового пояса на сервер. Сервер должен знать эту зону. Вы можете проверить с помощью

 SELECT DISTINCT tzname FROM V$TIMEZONE_NAMES where tzname like 'Etc%';
  

У меня есть несколько серверов БД, которые знают о «Etc / UTC» и «UTC» (tzfile версии 18), но другие знают только «UTC» (tz версии 11).

 SELECT FILENAME,VERSION from V$TIMEZONE_FILE;
  

На стороне клиента JDBC также наблюдается различное поведение. Начиная с версии 11.2, драйвер будет отправлять идентификаторы зон, если они «известны» Oracle, тогда как до этого он отправлял смещение по времени. Проблема с этой «отправкой известных идентификаторов» заключается в том, что клиент не проверяет, какая версия / содержимое часового пояса присутствует на сервере, но имеет свой собственный список.

Это объясняется в статье службы поддержки Oracle [ID 1068063.1].

Похоже, это также зависит от клиентской ОС, было более вероятно, что Etc / UTC не работает с Ubuntu, чем RHEL или Windows. Я предполагаю, что это связано с некоторой нормализацией, но я не понял, что именно.

Ответ №6:

  1. в eclipse перейдите выполнить -> выполнить конфигурацию

  2. там перейдите на вкладку JRE в правой боковой панели

  3. в разделе Аргументы виртуальной машины вставьте это

    -Duser.timezone=GMT

  4. затем Применить -> Выполнить

Ответ №7:

У меня возникла эта проблема при запуске автоматических тестов с сервера непрерывной интеграции. Я попытался добавить аргумент виртуальной машины « -Duser.timezone=GMT » к параметрам сборки, но это не решило проблему. Однако добавление переменной среды « TZ=GMT » исправило это для меня.

Комментарии:

1. Переменная среды «TZ = GMT» также работала для меня. У меня возникли проблемы со сценарием оболочки, который настраивал среду для запуска отдельного инструмента, который, в свою очередь, обращался к Oracle.

2. Из-за той же проблемы мне тоже пришлось использовать «TZ = Europe / Zurich» при использовании «ant». Это сработало!

3. Это должен быть главный ответ. Все остальные ответы не сработали.

4. в docker это сработало для меня TZ=America/Los_Angeles

5. Добавление TZ = IST сработало для меня, когда сборка jenkins, расположенная в GMT 2, пыталась получить доступ к базе данных, расположенной в Индии.

Ответ №8:

Я столкнулся с этой проблемой с Tomcat. Установка следующего в $CATALINA_BASE/bin/setenv.sh решила проблему:

 JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false
  

Я уверен, что использование одного из предложений параметров Java из других ответов будет работать таким же образом.

Ответ №9:

ОШИБКА :

ORA-00604: произошла ошибка при рекурсивном SQL уровня 1 ORA-01882: регион часового пояса не найден

Решение: настройка CIM в Centos.

 /opt/oracle/product/ATG/ATG11.2/home/bin/dynamoEnv.sh
  

Добавьте эти аргументы java:

 JAVA_ARGS="${JAVA_ARGS} -Duser.timezone=EDT"
  

Ответ №10:

В Netbeans,

  1. Щелкните правой кнопкой мыши ваш проект -> Свойства
  2. Перейдите к запуску (в разделе Категории)
  3. Введите -Duser.timezone=UTC или -Duser.timezone=GMT в разделе Параметры виртуальной машины.

Нажмите Ok, затем повторно запустите свою программу.

Примечание: вы также можете установить другие временные интервалы, кроме UTC и GMT.

Ответ №11:

Если эта проблема в JDeveloper: измените свойства проекта как для модели, так и для проекта представления -> выполнить / отладка -> профиль по умолчанию -> редактировать добавьте следующий параметр запуска: -Duser.timezone=Азия / Калькутта

Убедитесь, что указанное выше значение часового пояса извлекается из вашей базы данных следующим образом:

 select TZNAME from V$TIMEZONE_NAMES;
  

Наряду с этим вы хотели бы проверить настройки часового пояса в вашем jdev.conf, а также в JDeveloper -> Меню приложения -> Свойства проекта по умолчанию -> Выполнить / Отладка -> Профиль по умолчанию -> Параметры запуска.

Ответ №12:

Я также столкнулся с аналогичной проблемой.

Окружающая среда:

Linux, проект гибернации, драйвер ojdbc6 при запросе базы данных oracle 11g.

Разрешение

Параметр TZ не был установлен на компьютере Linux, который в основном сообщает oracle о часовом поясе. Итак, после добавления статуса экспорта «export TZ = UTC» во время запуска приложения моя проблема была решена.

UTC —> Измените в соответствии с вашим часовым поясом.

Ответ №13:

У меня была такая же проблема при попытке установить соединение на OBIEE с Oracle db. Я изменил часовой пояс Windows с (GMT 01:00) Западная Центральная Африка на (GMT 01:00) Брюссель, Копенгаген, Мадрид, Париж. Затем я перезагрузил свой компьютер, и он работал просто отлично. Похоже, Oracle не смог распознать часовой пояс западной и центральной Африки.

Ответ №14:

Эта проблема возникает, поскольку код, который пытается подключиться к БД, имеет часовой пояс, которого нет в БД. Это также можно решить, установив часовой пояс, как указано ниже, или любой допустимый часовой пояс, доступный в oracle db. допустимый часовой пояс, который можно найти, выберите * из версии v $;

System.setProperty(«user.timezone», «America / New_York»); TimeZone.setDefault(null);

Ответ №15:

У меня тоже была такая же проблема, когда я пытался создать соединение в JDeveloper. Наш сервер расположен в другом часовом поясе, и, следовательно, он вызвал следующие ошибки::

 ORA-00604: error occurred at recursive SQL level 1 

ORA-01882: timezone region not found
  

Я ссылался на многие форумы, которые просили включить часовой пояс в параметры Java (Run / Debug / Profile) свойств проекта и свойств проекта по умолчанию -Duser.timezone=" 02:00" , но у меня это не сработало. Наконец, следующее решение сработало для меня.

Добавьте следующую строку в файл конфигурации JDeveloper (jdev.conf).

 AddVMOption -Duser.timezone=UTC 02:00
  

Файл находится в «<корень установки oracle> Middleware jdeveloper jdev bin jdev.conf».

Ответ №16:

В моем случае я мог бы заставить запрос работать, изменив «TZR» на «TZD»..

 String query = "select * from table1 to_timestamp_tz(origintime,'dd-mm-yyyy hh24:mi:ss TZD') between ?  and ?";
  

Ответ №17:

Я смог решить ту же проблему, установив часовой пояс в моей системе Linux (Centos6.5).

Перепечатка с

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html

  1. установите часовой /etc/sysconfig/clock пояс, например, в значение ZONE=»America / Los_Angeles»

  2. sudo ln -sf /usr /share/zoneinfo/America / Phoenix /etc/localtime

Чтобы определить значение часового пояса, попробуйте

 ls /usr/share/zoneinfo
  

и найдите файл, который представляет ваш часовой пояс.

После установки этих параметров перезагрузите компьютер и повторите попытку.

Комментарии:

1. Для меня, чтобы убедиться, что /etc/sysconfig/clock и ссылка /etc/localtime были установлены правильно, было в основном необходимым условием для решения проблемы ORA-01882.

Ответ №18:

Столкнувшись с той же проблемой при использовании Eclipse и удаленной базы данных Oracle, изменение моего системного часового пояса в соответствии с часовым поясом сервера базы данных устранило проблему. Повторно запустите компьютер после смены системного часового пояса.

Я надеюсь, что это может кому-то помочь

Ответ №19:

java.sql.SQLException: ORA-00604: произошла ошибка при рекурсивном SQL уровня 1 ORA-01882: регион часового пояса не найден

Для такого типа ошибок просто измените системное время на стандартный формат GMT в вашей стране

например, индийский часовой пояс — Ченнаи, Калькутта.

Ответ №20:

Происходит, когда вы используете неправильную версию OJDBC jar.

Вам нужно использовать 11.2.0.4

Ответ №21:

В моем случае я установил часовой пояс на уровне моей ОС (ubuntu) с помощью этой команды.

timedatectl set-timezone {часовой пояс}

Например,

 timedatectl set-timezone Africa/Kampala
  

Ответ №22:

Это может быть немного поздно, но это может кому-то помочь. Я столкнулся с этой проблемой во время работы с приложением spring-boot и не смог подключиться к базе данных Oracle.

Ошибка:

java.sql.SQLException: ORA-00604: произошла ошибка при рекурсивном SQL уровня 1

ORA-01882: регион часового пояса не найден

 SELECT DBTIMEZONE FROM dual; -- This return:  00:00
timedatectl #The OS on the other hand returned correct time and timezone
  

Поскольку я не системный администратор и мне не разрешено изменять конфигурацию системы, мне пришлось применить обходной путь в кодах.

 spring.datasource.hikari.data-source-properties.oracle.jdbc.timezoneAsRegion=false
#Added the above into the application property file 
  

Рабочее решение взято из приведенной ниже ссылки

URL рабочего решения

Редактировать


После того, как администратор базы данных исправил oracle отсутствующими исправлениями часового пояса, вышеуказанное (…timezoneAsRegion=false) больше не было нужно.

Ответ №23:

Для приложения с весенней загрузкой — // добавить ниже две строки

 @SpringBootApplication
public class  Application {
  public static void main(String[] args) {
     // add below two lines
      System.out.println("Setting the timezone" TimeZone.getTimeZone("GMT 9:00").getID());
      TimeZone.setDefault(TimeZone.getTimeZone("GMT 9:00"));
      SpringApplication.run(Application.class, args);
  }
}