ORA-01882: область часового поясу не знайдена


102

Я отримую доступ до бази даних Oracle з програми Java, коли я запускаю свою програму, я отримую таку помилку:

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


Розкажіть про своє оточення, як ви запускаєте свою Java?
ABCade

Я запускаю програму Java у командному рядку. Windows 7 64bit, але Oracle DB працює на віддаленому сервері Unix.
ndalama

9
спробуйте додати "-Duser.timezone = <YOUR_GMT>" до своєї команди, не забудьте замінити <YOUR_GMT> на ваш GMT, тобто -Duser.timezone = "+ 05:30"
ABCade

Відповіді:


87

Ви також можете спробувати перевірити версію драйвера 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 (всередині банку). Знайшли це рішення тут

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


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

33
Нарешті, до командного рядка можна додати -Doracle.jdbc.timezoneAsRegion = false, або AddVMOption -Doracle.jdbc.timezoneAsRegion = false у конфігураційні файли, які використовують це позначення.
Маттео Стекколіні

Дякую stmsat Це працювало для мене. Я змінив свою банку ojdbc на версію 11.1.0.7.0 у каталозі tomcat / lib, і вона почала працювати :).
mdev

1
Я використовую maven для створення та упаковки (війни) свого проекту та розгортання в Cloud Flare, чи є спосіб встановлення цього властивості з файлу application.properties або з maven.
Ісмаїл

41

У звичайній інсталяції SQL-Developer під Windows перейдіть до каталогу

C:\Program Files\sqldeveloper\sqldeveloper\bin

і додати

AddVMOption -Duser.timezone=CET

подати sqldeveloper.conf.


Використовуючи Jetbrains DataGrip і зіткнувшись з тією ж проблемою після додавання цього параметра VM, проблема була вирішена
latsha

Дякую, це справді дуже допомогло!
Кінтон

27

Помилка:

Помилка 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;
}

зараз це працює !!


Дякую, саме це мені було потрібно!
Алан Томпсон

Я не знаю, чому не сподобався часовий пояс "Європа / Мадрид" за замовчуванням. Встановлення часового поясу за замовчуванням на "GMT" працює.
fgui

22

Оновіть файл oracle / jdbc / defaultConnectionProperties.properties у будь-якій версії бібліотеки (тобто у вашій банці), яку ви використовуєте, щоб містити рядок нижче:

oracle.jdbc.timezoneAsRegion=false

19

Що відбувається, так це те, що клієнт JDBC надсилає ідентифікатор часового поясу на Сервер. Сервер повинен знати цю зону. Ви можете перевірити

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

У мене є кілька db-серверів, які знають про "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. Я думаю, це пов'язано з деякою нормалізацією, але я не зрозумів, що саме.


14
  1. у затемненні go run -> конфігурація запуску

  2. там перейдіть на вкладку JRE у правій бічній панелі

  3. у розділі « Аргументи В.М.» вставити це

    -Duser.timezone=GMT

  4. потім застосувати -> Виконати


8

У мене була ця проблема під час запуску автоматизованих тестів із сервера безперервної інтеграції. Я спробував додати аргумент VM -Duser.timezone=GMTдо параметрів збірки, але це не вирішило проблему. Однак додавання змінної середовища " TZ=GMT" виправило це для мене.


2
Змінна середовища "TZ = GMT" також працювала для мене. У мене виникли проблеми зі скриптом оболонки, який створив середовище для запуску окремого інструменту, який, у свою чергу, отримав доступ до Oracle.
Девід Кінер

1
Маючи те саме питання, мені теж довелося використовувати "TZ = Європа / Цюріх", коли використовував "мурашник". Це спрацювало!
Крістоф Келін

2
Це має бути головна відповідь. Усі інші відповіді не спрацювали.
Алекс Дембо

4

ПОМИЛКА:

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"

3

У Netbeans,

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

Натисніть кнопку Ок, а потім перезапустіть програму.

Примітка: Ви також можете встановити інші часові камені, крім UTC та GMT.


2

Я зіткнувся з цією проблемою з Tomcat. Встановлюючи наступне у $CATALINA_BASE/bin/setenv.shвирішенні проблеми:

JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false

Я впевнений, що використання одного з параметрів Java з інших відповідей буде працювати так само.


2

Я також зіткнувся з подібним питанням.

Середовище:

Linux, сплячий проект, драйвер ojdbc6 під час запитів у базу даних Oracle 11g.

Дозвіл

Параметр TZ не був встановлений в машині Linux, що в основному повідомляє oracle про часовий пояс. Тож, додавши експортну статтю, "експорт TZ = UTC" на момент запуску програми вирішив мою проблему.

UTC -> Зміна відповідно до свого часового поясу.


2

Якщо ця проблема в JDeveloper: Змініть властивості проекту як для моделі, так і для перегляду проекту -> run / debug -> профіль за замовчуванням -> редагування додайте наступний варіант запуску: -Duser.timezone = Asia / Calcutta

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

select TZNAME from V$TIMEZONE_NAMES;

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


1

У мене теж була така ж проблема, коли я намагався створити з'єднання в JDeveloper. Наш сервер розташований у різних часових поясах, і тому він викликав наведені нижче помилки як:

ORA-00604: error occurred at recursive SQL level 1 

ORA-01882: timezone region not found

Я вказав багато форумів, які просили включити часовий пояс у параметри Java (Запуск / налагодження / профіль) властивостей проекту та властивостей проекту за замовчуванням як -Duser.timezone="+02:00" bBut, але це не працювало для мене. Нарешті наступне рішення спрацювало для мене.

Додайте наступний рядок до файлу конфігурації JDeveloper ( jdev.conf ).

AddVMOption -Duser.timezone=UTC+02:00

Файл розташований у "<корені установки oracle> \ Middleware \ jdeveloper \ jdev \ bin \ jdev.conf".


1

У моєму випадку я міг би отримати запит працюючи, змінивши "TZR" на "TZD" ..

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

1

Мені вдалося вирішити ту саму проблему, встановивши часовий пояс у моїй системі 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 / тощо / localtime

Щоб визначити значення часового поясу, спробуйте

ls /usr/share/zoneinfo

і шукайте файл, який представляє ваш часовий пояс.

Як тільки ви встановите ці перезавантаження машини, спробуйте ще раз.


2
Для мене переконання, що / etc / sysconfig / clock і посилання / etc / localtime були встановлені належним чином, в основному були необхідною умовою для вирішення проблеми ORA-01882.
Девід Кінер

1

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


1

Ця проблема трапляється, оскільки код, який намагається підключитися до db, має часовий пояс, який не знаходиться в db. Його також можна вирішити, встановивши часовий пояс як нижче, або будь-який дійсний часовий пояс, доступний в Oracle db. допустимий часовий пояс, який можна знайти, виберіть * з версії v $;

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


0

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

Я сподіваюся, що це може комусь допомогти


0

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

Для цього типу помилок просто змініть свій системний час на стандартний формат GMT для вашої країни

наприклад, індійський часовий пояс - це Ченнаї, Колката.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.