ORA-01882: Zeitzonenregion nicht gefunden

102

Ich greife über eine Java-Anwendung auf eine Oracle-Datenbank zu. Wenn ich meine Anwendung ausführe, wird folgende Fehlermeldung angezeigt:

java.sql.SQLException: ORA-00604: Fehler bei rekursiver SQL-Ebene 1 ORA-01882: Zeitzonenbereich nicht gefunden

ndalama
quelle
Erzählen Sie uns von Ihrer Umgebung, wie führen Sie Ihr Java aus?
ABCade
Ich führe die Java-Anwendung in der Befehlszeile aus. Windows 7 64-Bit, aber Oracle DB wird auf einem Remote-Unix-Server ausgeführt.
Ndalama
9
Versuchen Sie, "-Duser.timezone = <YOUR_GMT>" zu Ihrem Befehl hinzuzufügen. Vergessen Sie nicht, <YOUR_GMT> durch Ihre GMT zu ersetzen, dh -Duser.timezone = "+ 05:30"
ABCade

Antworten:

87

Sie können auch versuchen, die Version des Oracle JDBC-Treibers und der Oracle-Datenbank zu überprüfen. Erst heute hatte ich dieses Problem, als ich ojdbc6.jar (Version 11.2.0.3.0) verwendete, um eine Verbindung zu einem Oracle 9.2.0.4.0-Server herzustellen. Das Ersetzen durch ojdbc6.jar Version 11.1.0.7.0 löste das Problem.

Ich habe es auch geschafft, ojdbc6.jar Version 11.2.0.3.0 ohne Fehler zu verbinden, indem ich die oracle.jdbc.timezoneAsRegion=falseDatei oracle / jdbc / defaultConnectionProperties.properties (im JAR) hinzugefügt habe. Diese Lösung haben Sie hier gefunden

Zuletzt kann man -Doracle.jdbc.timezoneAsRegion=falseder Befehlszeile oder AddVMOption -Doracle.jdbc.timezoneAsRegion=falsein Konfigurationsdateien hinzufügen , die diese Notation verwenden

Matteo Steccolini
quelle
24
Ich habe es auch geschafft, ojdbc6.jar Version 11.2.0.3.0 ohne Fehler zu verbinden, indem ich oracle.jdbc.timezoneAsRegion = false in der Datei oracle / jdbc / defaultConnectionProperties.properties (im jar) hinzugefügt habe. Diese Lösung finden Sie hier: forums.oracle.com/forums/thread.jspa?threadID=1095807
Matteo Steccolini
33
Zuletzt kann man -Doracle.jdbc.timezoneAsRegion = false zur Befehlszeile oder AddVMOption -Doracle.jdbc.timezoneAsRegion = false in Konfigurationsdateien hinzufügen, die diese Notation verwenden.
Matteo Steccolini
Danke stmsat. Es hat bei mir funktioniert. Ich habe mein ojdbc jar in die Version 11.1.0.7.0 im Verzeichnis tomcat / lib geändert und es hat angefangen zu funktionieren :).
Mdev
1
Ich verwende maven, um mein Projekt zu erstellen, zu verpacken (zu warnen) und in Cloud Flare bereitzustellen. Gibt es eine Möglichkeit, diese Eigenschaft über die Datei application.properties oder über maven festzulegen?
Ismail
40

In einer einfachen SQL-Developer-Installation unter Windows wechseln Sie in das Verzeichnis

C:\Program Files\sqldeveloper\sqldeveloper\bin

und hinzufügen

AddVMOption -Duser.timezone=CET

zu archivieren sqldeveloper.conf.

Marcus Rickert
quelle
Mit Jetbrains DataGrip und dem gleichen Problem nach dem Hinzufügen dieser VM-Option wurde das Problem gelöst
Latsha
Danke, das hat wirklich sehr geholfen!
Quinton
27

Fehler, den ich bekam:

Fehler von db_connection.java - >> java.sql.SQLException: ORA-00604: Fehler bei rekursiver SQL-Ebene 1 ORA-01882: Zeitzonenbereich nicht gefunden

ORA-00604: Fehler auf rekursiver SQL-Ebene 1ORA-01882: Zeitzonenbereich nicht gefunden

Vorheriger Code:

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

neuer Code:

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

jetzt funktioniert es !!

Waruna Sri Jayanth
quelle
Danke, genau das habe ich gebraucht!
Alan Thompson
Ich weiß nicht, warum die Standardzeitzone "Europa / Madrid" nicht gefallen hat. Das Einstellen der Standardzeitzone auf 'GMT' funktioniert.
Fgui
22

Aktualisieren Sie die Datei oracle / jdbc / defaultConnectionProperties.properties in der Version der Bibliothek (dh in Ihrem JAR), die Sie verwenden, um die folgende Zeile zu enthalten:

oracle.jdbc.timezoneAsRegion=false
Babatunde Adeyemi
quelle
19

Was passiert ist, dass der JDBC-Client die Zeitzonen-ID an den Server sendet. Der Server muss diese Zone kennen. Sie können mit überprüfen

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

Ich habe einige Datenbankserver, die sich mit 'Etc / UTC' und 'UTC' auskennen (tzfile Version 18), andere kennen nur 'UTC' (tz Version 11).

SELECT FILENAME,VERSION from V$TIMEZONE_FILE;

Es gibt auch ein anderes Verhalten auf der JDBC-Clientseite. Ab 11.2 sendet der Treiber die Zonen-IDs, wenn sie Oracle "bekannt" sind, während zuvor der Zeitversatz gesendet wurde. Das Problem bei diesem "Senden bekannter IDs" besteht darin, dass der Client nicht überprüft, welche Zeitzonenversion / welcher Zeitzoneninhalt auf dem Server vorhanden ist, sondern über eine eigene Liste verfügt.

Dies wird im Oracle-Support-Artikel [ID 1068063.1] erläutert.

Es scheint, dass es auch vom Client-Betriebssystem abhängt. Es war wahrscheinlicher, dass Etc / UTC mit Ubuntu fehlschlägt als mit RHEL oder Windows. Ich denke, das liegt an einer Normalisierung, aber ich habe nicht genau herausgefunden, was.

eckes
quelle
14
  1. In Eclipse gehen Sie laufen -> Konfiguration ausführen

  2. Gehen Sie dort zur Registerkarte JRE in den rechten Seitenbereichen

  3. Fügen Sie dies im Abschnitt VM-Argumente ein

    -Duser.timezone=GMT

  4. dann Übernehmen -> Ausführen

Priyan beim Dialog
quelle
8

Ich hatte dieses Problem beim Ausführen automatisierter Tests von einem Server für kontinuierliche Integration. Ich habe versucht, das VM-Argument " -Duser.timezone=GMT" zu den Build-Parametern hinzuzufügen , aber das hat das Problem nicht gelöst. Das Hinzufügen der Umgebungsvariablen " TZ=GMT" hat dies jedoch für mich behoben.

Matt
quelle
2
Die Umgebungsvariable "TZ = GMT" hat auch bei mir funktioniert. Ich hatte Probleme mit einem Shell-Skript, das die Umgebung für die Ausführung eines separaten Tools einrichtete, das wiederum auf Oracle zugegriffen hat.
David Keener
1
Mit dem gleichen Problem musste auch ich "TZ = Europe / Zurich" verwenden, wenn ich "ant" verwendete. Es funktionierte!
Christof Kälin
2
Dies sollte die beste Antwort sein. Alle anderen Antworten haben nicht funktioniert.
Alex Dembo
4

ERROR :

ORA-00604: Fehler bei rekursiver SQL-Ebene 1 aufgetreten. ORA-01882: Zeitzonenbereich nicht gefunden

Lösung: CIM-Setup in Centos.

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

Fügen Sie diese Java-Argumente hinzu:

JAVA_ARGS="${JAVA_ARGS} -Duser.timezone=EDT"
Guna Sekaran
quelle
3

In Netbeans

  1. Klicken Sie mit der rechten Maustaste auf Ihr Projekt -> Eigenschaften
  2. Gehen Sie zu Ausführen (unter Kategorien).
  3. Geben Sie unter VM-Optionen -Duser.timezone = UTC oder -Duser.timezone = GMT ein.

Klicken Sie auf OK und führen Sie das Programm erneut aus.

Hinweis: Sie können neben UTC und GMT auch andere Zeitsteine ​​festlegen.

Babatunde Adeyemi
quelle
2

Ich bin auf dieses Problem mit Tomcat gestoßen. Durch Einstellen der folgenden $CATALINA_BASE/bin/setenv.shOption wurde das Problem behoben:

JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false

Ich bin sicher, dass die Verwendung eines der Java-Parametervorschläge aus den anderen Antworten auf die gleiche Weise funktionieren würde.

Bonh
quelle
2

Ich stand auch vor einem ähnlichen Problem.

Umgebung:

Linux, Ruhezustand Projekt, ojdbc6 Treiber beim Abfragen der Oracle 11g Datenbank.

Auflösung

Der TZ-Parameter wurde in einer Linux-Maschine nicht eingestellt, die Orakel im Grunde über die Zeitzone informiert. Nach dem Hinzufügen der Exportanweisung "export TZ = UTC" zum Zeitpunkt des Anwendungsstarts wurde mein Problem gelöst.

UTC -> Ändern Sie entsprechend Ihrer Zeitzone.

user3721248
quelle
2

Wenn dieses Problem in JDeveloper auftritt: Ändern Sie die Projekteigenschaften sowohl für das Modell als auch für das Ansichtsprojekt -> Ausführen / Debuggen -> Standardprofil -> Bearbeiten. Fügen Sie die folgende Ausführungsoption hinzu: -Duser.timezone = Asia / Calcutta

Stellen Sie sicher, dass der oben genannte Zeitzonenwert wie folgt aus Ihrer Datenbank abgerufen wird:

select TZNAME from V$TIMEZONE_NAMES;

Außerdem möchten Sie die Zeitzoneneinstellungen in Ihrer jdev.conf sowie in JDeveloper -> Anwendungsmenü -> Standardprojekteigenschaften -> Ausführen / Debuggen -> Standardprofil -> Ausführungsoptionen überprüfen.

Mukul Rana
quelle
1

Ich hatte auch das gleiche Problem, als ich versuchte, eine Verbindung in JDeveloper herzustellen. Unser Server befindet sich in einer anderen Zeitzone und hat daher die folgenden Fehler ausgelöst:

ORA-00604: error occurred at recursive SQL level 1 

ORA-01882: timezone region not found

Ich habe viele Foren, in denen gefragt wurde, ob die Zeitzone in die Java-Optionen (Ausführen / Debuggen / Profil) der Projekteigenschaften und der Standardprojekteigenschaften aufgenommen werden soll, als -Duser.timezone="+02:00"b bezeichnet, aber es hat bei mir nicht funktioniert. Schließlich hat die folgende Lösung für mich funktioniert.

Fügen Sie der Konfigurationsdatei des JDeveloper ( jdev.conf ) die folgende Zeile hinzu .

AddVMOption -Duser.timezone=UTC+02:00

Die Datei befindet sich unter "<Oracle-Installationsstamm> \ Middleware \ jdeveloper \ jdev \ bin \ jdev.conf".

Raj
quelle
1

In meinem Fall könnte ich die Abfrage zum Laufen bringen, indem ich "TZR" durch "TZD" ändere.

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

Ich konnte das gleiche Problem lösen, indem ich die Zeitzone in meinem Linux-System (Centos6.5) einstellte.

Reposting von

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

  1. setze die Zeitzone in /etc/sysconfig/clockzB auf ZONE = "America / Los_Angeles"

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

Um den Zeitzonenwert herauszufinden, versuchen Sie es

ls /usr/share/zoneinfo

und suchen Sie nach der Datei, die Ihre Zeitzone darstellt.

Sobald Sie diese festgelegt haben, starten Sie den Computer neu und versuchen Sie es erneut.

Adi-Pradhan
quelle
2
Für mich war es im Grunde eine Voraussetzung, um das ORA-01882-Problem zu lösen, sicherzustellen, dass / etc / sysconfig / clock und der Link / etc / localtime richtig eingestellt sind.
David Keener
1

Ich hatte das gleiche Problem, als ich versuchte, eine Verbindung zwischen OBIEE und Oracle db herzustellen. Ich habe meine Windows-Zeitzone von (GMT + 01: 00) West-Zentralafrika auf (GMT + 01: 00) Brüssel, Kopenhagen, Madrid, Paris geändert. Dann habe ich meinen Computer neu gestartet und es hat gut funktioniert. Anscheinend konnte Oracle die Zeitzone West-Zentralafrikas nicht erkennen.

yushaa yave
quelle
1

Dieses Problem tritt auf, wenn der Code, der versucht, eine Verbindung zu db herzustellen, eine Zeitzone hat, die nicht in db enthalten ist. Sie können das Problem auch beheben, indem Sie die Zeitzone wie folgt oder eine gültige Zeitzone in oracle db festlegen. gültige Zeitzone, die gefunden werden kann, wählen Sie * aus der v $ -Version;

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

Uday Singh
quelle
0

Das gleiche Problem bei Verwendung von Eclipse und einer entfernten Oracle-Datenbank wurde behoben, indem meine Systemzeitzone so geändert wurde , dass sie mit der Zeitzone des Datenbankservers übereinstimmt. Starten Sie die Maschine neu, nachdem Sie die Systemzeitzone geändert haben.

Ich hoffe das kann jemandem helfen

S_intg
quelle
0

java.sql.SQLException: ORA-00604: Fehler bei rekursiver SQL-Ebene 1 ORA-01882: Zeitzonenbereich nicht gefunden

Ändern Sie für diese Art von Fehler einfach Ihre Systemzeit in das Standard-GMT-Format Ihres Landes

zB indische Zeitzone ist Chennai, Kolkata.

Manjunatha H.
quelle