ORA-01882:找不到时区

我正在从Java应用程序访问Oracle数据库,当我运行我的应用程序时出现以下错误:

java.sql.SQLException:ORA-00604:在recursionSQL级别1发生错误ORA-01882:找不到时区

您也可以尝试检查Oracle jdbc驱动程序和Oracle数据库的版本。 就在今天,我使用ojdbc6.jar(版本11.2.0.3.0)连接到Oracle 9.2.0.4.0服务器时遇到了这个问题。 用ojdbc6.jarreplace版本11.1.0.7.0解决了这个问题。

在一个普通的Windows下的SQL-Developer安装转到目录

C:\Program Files\sqldeveloper\sqldeveloper\bin 

并添加

 AddVMOption -Duser.timezone=CET 

sqldeveloper.conf文件。

我得到的错误:

错误来自db_connection.java – >> java.sql.SQLException:ORA-00604:在recursionSQL级别1发生错误ORA-01882:未find时区

ORA-00604:在recursionSQL级别发生错误1ORA-01882:未find时区区域

上一个代码:

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

现在它工作了!

更新文件oracle / jdbc / defaultConnectionProperties.properties在任何版本的库(即在你的jar里面)你用来包含下面的行:

 oracle.jdbc.timezoneAsRegion=false 

会发生什么情况是,JDBC客户端将时区ID发送到服务器。 服务器需要知道该区域。 你可以检查

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

我有一些数据库服务器知道“等/ UTC”和“UTC”(tzfile版本18),但其他人只知道“UTC”(tz版本11)。

 SELECT FILENAME,VERSION from V$TIMEZONE_FILE; 

在JDBC客户端也有不同的行为。 从11.2开始,如果驱动程序对Oracle“已知”,则发送区域ID,而在发送时间偏移之前。 这个“发送已知ID”的问题是,客户端不检查服务器上有什么时区版本/内容,而是有自己的列表。

这在Oracle支持文章[ID 1068063.1]中有解释。

看来这也取决于客户端操作系统,与Ubuntu或RHEL或Windows相比,Etc / UTC更有可能失败。 我想这是由于一些正常化,但我还没有弄清楚究竟是什么。

  1. 在eclipse中运行 – > 运行configuration

  2. 在那里去右侧面板的JRE标签

  3. 虚拟机参数部分粘贴这个

    -Duser.timezone=GMT

  4. 然后应用 – >运行

错误:ORA-00604:在recursionSQL级别1时发生错误ORA-01882:找不到时区

解决scheme:在Centos中安装CIM。

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

添加这个java参数:

JAVA_ARGS =“$ {JAVA_ARGS} -Duser.timezone = EDT”

在Netbeans中,

  1. 右键单击您的项目 – >属性
  2. 转到运行(在类别下)
  3. 在VM选项下input-Duser.timezone = UTC或-Duser.timezone = GMT。

点击确定,然后重新运行你的程序。

注意:除了UTC和GMT之外,您还可以设置其他时间戳。

从持续集成服务器运行自动化testing时遇到此问题。 我尝试添加VM参数“ -Duser.timezone=GMT ”到构build参数,但是这并没有解决问题。 但是,添加环境variables“ TZ=GMT ”确实为我解决了这个问题。

如果JDeveloper中存在这个问题:更改模型和视图项目的项目属性 – >运行/debugging – >默认configuration文件 – >编辑添加以下运行选项:-Duser.timezone = Asia / Calcutta

确保从数据库中获取上述时区值,如下所示:

从V $ TIMEZONE_NAMES中selectTZNAME;

除此之外,您还希望检查jdev.conf中的时区设置以及JDeveloper – > Application Menu – > Default Project Propertes – > Run / Debug – > Default Profile – > Run Options。

我能够通过在我的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

并查找代表您的时区的文件。

一旦你设置这些重新启动机器,然后再试一次。

在我的情况下,我可以通过改变“TZR”与“TZD”的查询工作..

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

当我尝试在JDeveloper中创build连接时,我也遇到了同样的问题。 我们的服务器位于不同的时区,因此它提出了以下错误:

 ORA-00604: error occurred at recursive SQL level 1 ORA-01882: timezone region not found 

我提到了许多论坛,要求在项目属性和默认项目属性的Java选项(运行/debugging/configuration文件)中包含时区为-Duser.timezone="+02:00" b但它不适用于我。 最后,下面的解决scheme为我工作。

将以下行添加到JDeveloper的configuration文件( jdev.conf )中。

 AddVMOption -Duser.timezone=UTC+02:00 

该文件位于“<oracle安装根目录> \ Middleware \ jdeveloper \ jdev \ bin \ jdev.conf”中。

面对使用Eclipse和远程Oracle数据库的相同问题,更改我的系统时区以匹配数据库服务器的时区解决了问题。 更改系统时区后重新启动机器

我希望这可以帮助别人

我遇到了Tomcat的这个问题。 在$CATALINA_BASE/bin/setenv.sh设置以下内容解决了这个问题:

 JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false 

我确信使用来自其他答案的Java参数build议之一将以相同的方式工作。

java.sql.SQLException:ORA-00604:在recursionSQL级别1发生错误ORA-01882:找不到时区

对于这种types的错误,只需将您的系统时间更改为您所在国家的标准GMT格式

例如印度时区是钦奈(khennai),科尔卡塔(kolkata)。