ORA-01882: nie znaleziono regionu strefy czasowej

102

Uzyskuję dostęp do bazy danych Oracle z aplikacji Java, po uruchomieniu aplikacji pojawia się następujący błąd:

java.sql.SQLException: ORA-00604: wystąpił błąd na rekurencyjnym poziomie 1 SQL ORA-01882: nie znaleziono regionu strefy czasowej

ndalama
źródło
Opowiedz nam o swoim środowisku, jak uruchamiasz java?
ABCade
Uruchamiam aplikację Java w wierszu poleceń. Windows 7 64-bitowy, ale Oracle DB działa na zdalnym serwerze Unix.
ndalama
9
spróbuj dodać „-Duser.timezone = <YOUR_GMT>” do swojego polecenia, nie zapomnij zastąpić <YOUR_GMT> swoim GMT, tj. -Duser.timezone = „+ 05:30”
ABCade

Odpowiedzi:

87

Możesz także spróbować sprawdzić wersję sterownika Oracle jdbc i bazy danych Oracle. Właśnie dzisiaj miałem ten problem podczas używania ojdbc6.jar (wersja 11.2.0.3.0) do łączenia się z serwerem Oracle 9.2.0.4.0. Zastąpienie go wersją ojdbc6.jar 11.1.0.7.0 rozwiązało problem.

Udało mi się również bezbłędnie połączyć ojdbc6.jar w wersji 11.2.0.3.0, dodając oracle.jdbc.timezoneAsRegion=falseplik oracle / jdbc / defaultConnectionProperties.properties (wewnątrz jar). Znalazłem to rozwiązanie tutaj

Na koniec można dodać -Doracle.jdbc.timezoneAsRegion=falsedo wiersza poleceń lub AddVMOption -Doracle.jdbc.timezoneAsRegion=falsew plikach konfiguracyjnych, które używają tej notacji

Matteo Steccolini
źródło
24
Udało mi się również połączyć ojdbc6.jar w wersji 11.2.0.3.0 bez błędów, dodając oracle.jdbc.timezoneAsRegion = false w pliku oracle / jdbc / defaultConnectionProperties.properties (wewnątrz jar). Znalazłem to rozwiązanie tutaj: forums.oracle.com/forums/thread.jspa?threadID=1095807
Matteo Steccolini
33
Na koniec można dodać -Doracle.jdbc.timezoneAsRegion = false do wiersza poleceń lub AddVMOption -Doracle.jdbc.timezoneAsRegion = false w plikach konfiguracyjnych, które używają tej notacji.
Matteo Steccolini
Dzięki stmsat. U mnie to zadziałało. Zmieniłem mój jar ojdbc na wersję 11.1.0.7.0 w katalogu tomcat / lib i zaczęło działać :).
mdev
1
Używam mavena do budowania i pakowania (wojny) mojego projektu i wdrażania w Cloud Flare, czy istnieje jakikolwiek sposób ustawienia tej właściwości z pliku application.properties lub z maven.
Ismail
41

W zwykłej instalacji SQL-Developer pod Windows przejdź do katalogu

C:\Program Files\sqldeveloper\sqldeveloper\bin

i dodaj

AddVMOption -Duser.timezone=CET

do pliku sqldeveloper.conf.

Marcus Rickert
źródło
Używając Jetbrains DataGrip i napotkałem ten sam problem po dodaniu tej opcji maszyny wirtualnej, problem został rozwiązany
latsha
Dzięki, to naprawdę bardzo pomogło!
Quinton
27

Otrzymałem błąd:

Błąd z db_connection.java - >> java.sql.SQLException: ORA-00604: wystąpił błąd na rekurencyjnym poziomie 1 SQL ORA-01882: nie znaleziono regionu strefy czasowej

ORA-00604: wystąpił błąd na rekurencyjnym poziomie SQL 1ORA-01882: nie znaleziono regionu strefy czasowej

Poprzedni kod:

 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;
}

nowy kod:

 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;
}

teraz działa!!

Waruna Sri Jayanth
źródło
Dziękuję, właśnie tego potrzebowałem!
Alan Thompson
Nie wiem, dlaczego nie podobała mu się domyślna strefa czasowa „Europa / Madryt”. Ustawienie domyślnej strefy czasowej na „GMT” działa.
fgui
22

Zaktualizuj plik oracle / jdbc / defaultConnectionProperties.properties w dowolnej wersji biblioteki (tj. W pliku jar), którego używasz, aby zawierał poniższą linię:

oracle.jdbc.timezoneAsRegion=false
Babatunde Adeyemi
źródło
19

Dzieje się tak, że klient JDBC wysyła identyfikator strefy czasowej do serwera. Serwer musi znać tę strefę. Możesz to sprawdzić

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

Mam kilka serwerów db, które wiedzą o „Etc / UTC” i „UTC” (tzfile wersja 18), ale inne znają tylko „UTC” (tz wersja 11).

SELECT FILENAME,VERSION from V$TIMEZONE_FILE;

Inne zachowanie występuje także po stronie klienta JDBC. Począwszy od wersji 11.2 kierowca wysyła identyfikatory stref, jeśli jest „znany” Oracle, podczas gdy przed wysłaniem przesunięcia czasu. Problem z tym „wysyłaniem znanych identyfikatorów” polega na tym, że klient nie sprawdza, jaka wersja / zawartość strefy czasowej jest obecna na serwerze, ale ma własną listę.

Wyjaśniono to w artykule pomocy technicznej Oracle [ID 1068063.1].

Wygląda na to, że zależy to również od systemu operacyjnego klienta, było bardziej prawdopodobne, że Etc / UTC zawodzi z Ubuntu niż RHEL lub Windows. Myślę, że jest to spowodowane pewną normalizacją, ale nie wiem, co dokładnie.

eckes
źródło
14
  1. w eclipse go run -> uruchom konfigurację

  2. tam przejdź do zakładki JRE w prawych panelach bocznych

  3. w sekcji VM Arguments wklej to

    -Duser.timezone=GMT

  4. następnie Zastosuj -> Uruchom

Priyan w Dialog
źródło
8

Miałem ten problem podczas uruchamiania testów automatycznych z serwera ciągłej integracji. Próbowałem dodać argument VM -Duser.timezone=GMTdo parametrów kompilacji, ale to nie rozwiązało problemu. Jednak dodanie zmiennej środowiskowej „ TZ=GMT” rozwiązało problem.

Matt
źródło
2
Zmienna środowiskowa „TZ = GMT” również działała dla mnie. Miałem problemy ze skryptem powłoki, który konfigurował środowisko do uruchamiania oddzielnego narzędzia, które z kolei uzyskiwało dostęp do Oracle.
David Keener,
1
Mając ten sam problem, również musiałem użyć „TZ = Europe / Zurich” podczas używania „ant”. Zadziałało!
Christof Kälin
2
To powinna być najlepsza odpowiedź. Wszystkie inne odpowiedzi nie zadziałały.
Alex Dembo,
4

BŁĄD:

ORA-00604: wystąpił błąd na rekurencyjnym poziomie 1 SQL ORA-01882: nie znaleziono regionu strefy czasowej

Rozwiązanie: konfiguracja CIM w Centos.

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

Dodaj te argumenty java:

JAVA_ARGS="${JAVA_ARGS} -Duser.timezone=EDT"
Guna Sekaran
źródło
3

W Netbeans,

  1. Kliknij prawym przyciskiem myszy projekt -> Właściwości
  2. Idź do biegu (w kategoriach)
  3. Wpisz -Duser.timezone = UTC lub -Duser.timezone = GMT w sekcji VM Options.

Kliknij OK, a następnie ponownie uruchom program.

Uwaga: możesz również ustawić inne kamienie czasowe poza UTC i GMT.

Babatunde Adeyemi
źródło
2

Napotkałem ten problem z Tomcat. Ustawienie następujących elementów $CATALINA_BASE/bin/setenv.shrozwiązało problem:

JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false

Jestem pewien, że użycie jednej z propozycji parametrów Java z innych odpowiedzi zadziałałoby w ten sam sposób.

bonh
źródło
2

Ja też miałem podobny problem.

Środowisko:

Linux, projekt hibernacji, sterownik ojdbc6 podczas odpytywania bazy danych oracle 11g.

Rozkład

Parametr TZ nie został ustawiony na komputerze z systemem Linux, co w zasadzie mówi Oracle o strefie czasowej. Tak więc, po dodaniu informacji o eksporcie „export TZ = UTC” w momencie składania wniosku rozpoczęło się rozwiązanie mojego problemu.

UTC -> Zmień według strefy czasowej.

user3721248
źródło
2

Jeśli ten problem występuje w JDeveloper: Zmień właściwości projektu zarówno dla modelu, jak i widoku projektu -> uruchom / debuguj -> domyślny profil -> edytuj dodaj następującą opcję uruchamiania: -Duser.timezone = Asia / Calcutta

Upewnij się, że powyższa wartość strefy czasowej została pobrana z bazy danych w następujący sposób:

select TZNAME from V$TIMEZONE_NAMES;

Oprócz tego chciałbyś sprawdzić ustawienia strefy czasowej w swoim jdev.conf, a także w JDeveloper -> Menu aplikacji -> Domyślne właściwości projektu -> Uruchom / Debuguj -> Profil domyślny -> Opcje uruchamiania.

Mukul Rana
źródło
1

Ja też miałem ten sam problem, kiedy próbowałem stworzyć połączenie w JDeveloper. Nasz serwer znajdował się w innej strefie czasowej i dlatego podniósł poniższe błędy:

ORA-00604: error occurred at recursive SQL level 1 

ORA-01882: timezone region not found

Odniosłem się do wielu forów, które prosiły o uwzględnienie strefy czasowej w Opcjach Java (Uruchom / Debugowanie / Profil) we właściwościach projektu i Właściwościach domyślnego projektu jako -Duser.timezone="+02:00"b, ale to nie zadziałało. W końcu zadziałało następujące rozwiązanie.

Dodaj następujący wiersz do pliku konfiguracyjnego JDevelopera ( jdev.conf ).

AddVMOption -Duser.timezone=UTC+02:00

Plik znajduje się w lokalizacji „<katalog instalacyjny oracle> \ Middleware \ jdeveloper \ jdev \ bin \ jdev.conf”.

Raj
źródło
1

W moim przypadku mogłem uruchomić zapytanie zmieniając „TZR” na „TZD” ..

String query = "select * from table1 to_timestamp_tz(origintime,'dd-mm-yyyy hh24:mi:ss TZD') between ?  and ?";
Laura Liparulo
źródło
1

Udało mi się rozwiązać ten sam problem, ustawiając strefę czasową w moim systemie linux (Centos6.5).

Ponowne publikowanie z

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

  1. ustaw strefę czasową w /etc/sysconfig/clocknp. ustaw na ZONE = "America / Los_Angeles"

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

Spróbuj obliczyć wartość strefy czasowej

ls /usr/share/zoneinfo

i poszukaj pliku reprezentującego Twoją strefę czasową.

Po ustawieniu tych ustawień uruchom ponownie komputer i spróbuj ponownie.

adi-pradhan
źródło
2
Dla mnie upewnienie się, że / etc / sysconfig / clock i łącze / etc / localtime zostały ustawione poprawnie, było w zasadzie warunkiem rozwiązania problemu z ORA-01882.
David Keener
1

Miałem ten sam problem, gdy próbowałem nawiązać połączenie na OBIEE z bazą danych Oracle. Zmieniłem strefę czasową systemu Windows z (GMT + 01: 00) Afryka Środkowo-Zachodnia na (GMT + 01: 00) Bruksela, Kopenhaga, Madryt, Paryż. Następnie zrestartowałem komputer i wszystko działało dobrze. Wygląda na to, że Oracle nie był w stanie rozpoznać strefy czasowej w zachodniej Afryce.

yushaa yave
źródło
1

Ten problem występuje, ponieważ kod, który próbuje połączyć się z bazą danych, ma strefę czasową, której nie ma w bazie danych. Można to również rozwiązać, ustawiając strefę czasową jak poniżej lub dowolną poprawną strefę czasową dostępną w oracle db. poprawna strefa czasowa, którą można znaleźć wybierz * z wersji v $;

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

Uday Singh
źródło
0

W obliczu tego samego problemu podczas korzystania z Eclipse i odległej bazy danych Oracle, zmiana strefy czasowej systemu w celu dopasowania do strefy czasowej serwera bazy danych rozwiązała problem. Uruchom ponownie maszynę po zmianie strefy czasowej systemu.

Mam nadzieję, że to komuś pomoże

S_intg
źródło
0

java.sql.SQLException: ORA-00604: wystąpił błąd na rekurencyjnym poziomie 1 SQL ORA-01882: nie znaleziono regionu strefy czasowej

W przypadku tego typu błędu po prostu zmień czas systemowy na standardowy format GMT swojego kraju

np. strefa czasowa Indii to Chennai, Kalkuta.

manjunatha H.
źródło