ORA-01882: région du fuseau horaire introuvable

102

J'accède à une base de données Oracle à partir d'une application java, lorsque j'exécute mon application, j'obtiens l'erreur suivante:

java.sql.SQLException: ORA-00604: une erreur s'est produite au niveau SQL récursif 1 ORA-01882: la région du fuseau horaire est introuvable

ndalama
la source
Parlez-nous de votre environnement, comment exécutez-vous votre java?
ABCade
J'exécute l'application Java sur la ligne de commande. Windows 7 64 bits, mais Oracle DB s'exécute sur un serveur Unix distant.
ndalama
9
essayez d'ajouter "-Duser.timezone = <YOUR_GMT>" à votre commande, n'oubliez pas de remplacer <YOUR_GMT> par votre GMT, c'est-à-dire -Duser.timezone = "+ 05:30"
ABCade

Réponses:

87

Vous pouvez également essayer de vérifier la version du pilote Oracle jdbc et de la base de données Oracle. Aujourd'hui encore, j'ai eu ce problème lors de l'utilisation de ojdbc6.jar (version 11.2.0.3.0) pour me connecter à un serveur Oracle 9.2.0.4.0. Le remplacer par ojdbc6.jar version 11.1.0.7.0 a résolu le problème.

J'ai également réussi à faire connecter ojdbc6.jar version 11.2.0.3.0 sans erreur, en ajoutant oracle.jdbc.timezoneAsRegion=falsedans le fichier oracle / jdbc / defaultConnectionProperties.properties (à l'intérieur du pot). Trouvé cette solution ici

Enfin, on peut ajouter -Doracle.jdbc.timezoneAsRegion=falseà la ligne de commande, ou AddVMOption -Doracle.jdbc.timezoneAsRegion=falsedans les fichiers de configuration qui utilisent cette notation

Matteo Steccolini
la source
24
J'ai également réussi à faire en sorte que ojdbc6.jar version 11.2.0.3.0 se connecte sans erreur, en ajoutant oracle.jdbc.timezoneAsRegion = false dans le fichier oracle / jdbc / defaultConnectionProperties.properties (à l'intérieur du jar). J'ai
Matteo Steccolini
33
Enfin, on peut ajouter -Doracle.jdbc.timezoneAsRegion = false à la ligne de commande, ou AddVMOption -Doracle.jdbc.timezoneAsRegion = false dans les fichiers de configuration qui utilisent cette notation.
Matteo Steccolini
Merci stmsat. Cela a fonctionné pour moi. J'ai changé mon jar ojdbc en version 11.1.0.7.0 dans le répertoire tomcat / lib et cela a commencé à fonctionner :).
mdev
1
J'utilise maven pour créer et empaqueter (war) mon projet et le déployer dans Cloud Flare, est-il possible de définir cette propriété à partir du fichier application.properties ou de maven.
Ismail
41

Dans une simple installation SQL-Developer sous Windows, allez dans le répertoire

C:\Program Files\sqldeveloper\sqldeveloper\bin

et ajouter

AddVMOption -Duser.timezone=CET

déposer sqldeveloper.conf.

Marcus Rickert
la source
En utilisant Jetbrains DataGrip et confronté au même problème après l'ajout de cette option VM, le problème a été résolu
latsha
Merci, cela a vraiment beaucoup aidé!
Quinton
27

Erreur que j'ai:

Erreur de db_connection.java - >> java.sql.SQLException: ORA-00604: une erreur s'est produite au niveau SQL récursif 1 ORA-01882: région du fuseau horaire introuvable

ORA-00604: une erreur s'est produite au niveau SQL récursif 1ORA-01882: région de fuseau horaire introuvable

Code précédent:

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

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

maintenant ça marche !!

Waruna Sri Jayanth
la source
Merci, c'est exactement ce dont j'avais besoin!
Alan Thompson
Je ne sais pas pourquoi il n'aimait pas le fuseau horaire par défaut «Europe / Madrid». Le réglage du fuseau horaire par défaut sur «GMT» fonctionne.
fgui
22

Mettez à jour le fichier oracle / jdbc / defaultConnectionProperties.properties dans n'importe quelle version de la bibliothèque (c'est-à-dire à l'intérieur de votre fichier jar) que vous utilisez pour contenir la ligne ci-dessous:

oracle.jdbc.timezoneAsRegion=false
Babatunde Adeyemi
la source
19

Ce qui se passe, c'est que le client JDBC envoie l'ID de fuseau horaire au serveur. Le serveur a besoin de connaître cette zone. Vous pouvez vérifier avec

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

J'ai quelques serveurs db qui connaissent 'Etc / UTC' et 'UTC' (tzfile version 18) mais d'autres ne connaissent que 'UTC' (tz version 11).

SELECT FILENAME,VERSION from V$TIMEZONE_FILE;

Il existe également un comportement différent du côté client JDBC. À partir de 11.2, le pilote enverra les ID de zone si elle est "connue" à Oracle, alors qu'avant il envoyait le décalage horaire. Le problème avec cet "envoi d'identifiants connus" est que le client ne vérifie pas la version / le contenu du fuseau horaire présent sur le serveur mais a sa propre liste.

Ceci est expliqué dans l'article du support Oracle [ID 1068063.1].

Il semble que cela dépend également du système d'exploitation client, il était plus probable qu'Etc / UTC échoue avec Ubuntu que RHEL ou Windows. Je suppose que cela est dû à une normalisation, mais je n'ai pas compris quoi exactement.

eckes
la source
14
  1. dans eclipse aller courir -> exécuter la configuration

  2. là-bas, accédez à l' onglet JRE dans les panneaux latéraux droits

  3. dans la section Arguments VM , collez ceci

    -Duser.timezone=GMT

  4. puis Appliquer -> Exécuter

Priyan chez Dialog
la source
8

J'ai eu ce problème lors de l'exécution de tests automatisés à partir d'un serveur d'intégration continue. J'ai essayé d'ajouter l'argument VM " -Duser.timezone=GMT" aux paramètres de construction, mais cela n'a pas résolu le problème. Cependant, l'ajout de la variable d'environnement " TZ=GMT" a résolu le problème pour moi.

Mat
la source
2
La variable d'environnement "TZ = GMT" a également fonctionné pour moi. J'avais des problèmes avec un script shell qui configurait l'environnement pour exécuter un outil séparé qui, à son tour, accédait à Oracle.
David Keener
1
Ayant le même problème, j'ai dû moi aussi utiliser "TZ = Europe / Zurich" pour utiliser "fourmi". Ça a marché!
Christof Kälin
2
Cela devrait être la meilleure réponse. Toutes les autres réponses n'ont pas fonctionné.
Alex Dembo
4

ERREUR :

ORA-00604: une erreur s'est produite au niveau SQL récursif 1 ORA-01882: la région du fuseau horaire est introuvable

Solution: configuration CIM dans Centos.

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

Ajoutez ces arguments java:

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

Dans Netbeans,

  1. Faites un clic droit sur votre projet -> Propriétés
  2. Aller à Exécuter (sous Catégories)
  3. Entrez -Duser.timezone = UTC ou -Duser.timezone = GMT sous VM Options.

Cliquez sur OK, puis réexécutez votre programme.

Remarque: vous pouvez également définir d'autres timestones en plus de UTC et GMT.

Babatunde Adeyemi
la source
2

J'ai rencontré ce problème avec Tomcat. La configuration de ce qui suit a $CATALINA_BASE/bin/setenv.shrésolu le problème:

JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false

Je suis sûr que l'utilisation de l'une des suggestions de paramètres Java des autres réponses fonctionnerait de la même manière.

bonh
la source
2

J'ai également fait face à un problème similaire.

Environnement:

Linux, projet de mise en veille prolongée, pilote ojdbc6 lors de l'interrogation de la base de données oracle 11g.

Résolution

Le paramètre TZ n'a pas été défini dans la machine Linux, ce qui indique essentiellement à Oracle le fuseau horaire. Ainsi, après avoir ajouté la déclaration d'exportation "export TZ = UTC" au moment du démarrage de l'application, mon problème a été résolu.

UTC -> Changez selon votre fuseau horaire.

utilisateur3721248
la source
2

Si ce problème se trouve dans JDeveloper: modifiez les propriétés du projet pour le modèle et le projet de vue -> exécuter / déboguer -> profil par défaut -> modifier, ajoutez l'option d'exécution suivante: -Duser.timezone = Asia / Calcutta

Assurez-vous que la valeur de fuseau horaire ci-dessus est extraite de votre base de données comme suit:

select TZNAME from V$TIMEZONE_NAMES;

En plus de cela, vous voudrez vérifier les paramètres de fuseau horaire dans votre jdev.conf ainsi que dans JDeveloper -> Menu Application -> Propriétés du projet par défaut -> Exécuter / Déboguer -> Profil par défaut -> Options d'exécution.

Mukul Rana
la source
1

J'ai aussi eu le même problème lorsque j'ai essayé de créer une connexion dans JDeveloper. Notre serveur situé dans un fuseau horaire différent et, par conséquent, a soulevé les erreurs ci-dessous comme suit:

ORA-00604: error occurred at recursive SQL level 1 

ORA-01882: timezone region not found

J'ai fait référence à de nombreux forums qui ont demandé d'inclure le fuseau horaire dans les options Java (Exécuter / Déboguer / Profil) des propriétés du projet et des propriétés du projet par défaut comme -Duser.timezone="+02:00"bMais cela n'a pas fonctionné pour moi. Enfin, la solution suivante a fonctionné pour moi.

Ajoutez la ligne suivante au fichier de configuration de JDeveloper ( jdev.conf ).

AddVMOption -Duser.timezone=UTC+02:00

Le fichier se trouve dans "<racine d'installation oracle> \ Middleware \ jdeveloper \ jdev \ bin \ jdev.conf".

Raj
la source
1

Dans mon cas, je pourrais faire fonctionner la requête en remplaçant "TZR" par "TZD".

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

J'ai pu résoudre le même problème en définissant le fuseau horaire dans mon système Linux (Centos6.5).

Republication de

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

  1. définir le fuseau horaire par /etc/sysconfig/clockexemple sur ZONE = "America / Los_Angeles"

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

Pour déterminer la valeur du fuseau horaire, essayez de

ls /usr/share/zoneinfo

et recherchez le fichier qui représente votre fuseau horaire.

Une fois que vous avez défini ces paramètres, redémarrez la machine et réessayez.

adi-pradhan
la source
2
Pour moi, s'assurer que / etc / sysconfig / clock et le lien / etc / localtime étaient correctement définis était fondamentalement une condition préalable pour résoudre le problème ORA-01882.
David Keener
1

J'ai eu le même problème en essayant d'établir une connexion sur OBIEE à Oracle db. J'ai changé mon fuseau horaire Windows de (GMT + 01: 00) Afrique du Centre-Ouest à (GMT + 01: 00) Bruxelles, Copenhague, Madrid, Paris. Ensuite, j'ai redémarré mon ordinateur et cela a très bien fonctionné. On dirait qu'Oracle n'a pas été en mesure de reconnaître le fuseau horaire de l'Afrique centrale occidentale.

yushaa yave
la source
1

Ce problème se produit lorsque le code qui tente de se connecter à db a un fuseau horaire qui n'est pas dans db. Il peut également être résolu en définissant le fuseau horaire comme ci-dessous ou tout fuseau horaire valide disponible dans oracle db. fuseau horaire valide qui peut être trouvé sélectionnez * à partir de la version v $;

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

Uday Singh
la source
0

Face au même problème en utilisant Eclipse et une base de données Oracle distante, la modification du fuseau horaire de mon système pour correspondre au fuseau horaire du serveur de base de données a résolu le problème. Redémarrez la machine après avoir changé le fuseau horaire du système.

J'espère que cela peut aider quelqu'un

S_intg
la source
0

java.sql.SQLException: ORA-00604: une erreur s'est produite au niveau SQL récursif 1 ORA-01882: la région du fuseau horaire est introuvable

Pour ce type d'erreur, modifiez simplement l'heure de votre système au format GMT standard de votre pays

Par exemple, le fuseau horaire indien est Chennai, Kolkata.

manjunatha H
la source