ORA-01882:找不到时区区域


102

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

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


告诉我们您的环境,如何运行Java?
ABCade '02

我在命令行上运行Java应用程序。Windows 7 64位,但是Oracle DB在远程Unix服务器上运行。
ndalama

9
尝试在命令中添加“ -Duser.timezone = <YOUR_GMT>”,别忘了用GMT替换<YOUR_GMT>,即-Duser.timezone =“ + 05:30”
ABCade 2012年

Answers:


87

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

通过添加oracle.jdbc.timezoneAsRegion=false文件oracle / jdbc / defaultConnectionProperties.properties(位于jar内),我还设法使ojdbc6.jar版本11.2.0.3.0正确连接。在这里找到这个解决方案

最后,可以将其添加-Doracle.jdbc.timezoneAsRegion=false到命令行,或-Doracle.jdbc.timezoneAsRegion=false使用该符号的配置文件中添加AddVMOption 。


24
通过在文件oracle / jdbc / defaultConnectionProperties.properties中(在jar内)添加oracle.jdbc.timezoneAsRegion = false,我还设法使ojdbc6.jar版本11.2.0.3.0正确连接。在此处找到此解决方案:forums.oracle.com/forums/thread.jspa?threadID=1095807
Matteo Steccolini 2012年

33
最后,可以在命令行中添加-Doracle.jdbc.timezoneAsRegion = false,或在使用此符号的配置文件中添加AddVMOption -Doracle.jdbc.timezoneAsRegion = false。
Matteo Steccolini

谢谢stmsat。它为我工作。我将tomcat / lib目录中的ojdbc jar更改为11.1.0.7.0版本,它开始工作:)。
mdev

1
我正在使用maven构建和打包(打包)我的项目并部署到Cloud Flare中,是否可以通过application.properties文件或maven 设置此属性。
伊斯梅尔

40

在Windows下的普通SQL-Developer安装中,转到目录

C:\Program Files\sqldeveloper\sqldeveloper\bin

并添加

AddVMOption -Duser.timezone=CET

归档sqldeveloper.conf


使用Jetbrains DataGrip并在添加此VM Option之后面临相同的问题,此问题已解决
latsha

谢谢,这真的很有帮助!
昆顿

27

我得到的错误:

来自db_connection.java的错误->> java.sql.SQLException:ORA-00604:递归SQL级别1发生错误ORA-01882:找不到时区区域

ORA-00604:递归SQL级别1发生错误ORA-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

在用于包含以下行的任何版本的库中(即,在jar中)更新文件oracle / jdbc / defaultConnectionProperties.properties

oracle.jdbc.timezoneAsRegion=false

19

发生的是,JDBC客户端将时区ID发送到服务器。服务器需要知道该区域。您可以检查

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

我有一些知道'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]中对此进行了解释。

看来这也取决于客户端操作系统,与RHEL或Windows相比,Etc / UTC在Ubuntu上失败的可能性更大。我想这是由于某种标准化,但我还没有弄清楚到底是什么。


14
  1. 在Eclipse中运行 -> 运行配置

  2. 在那里,转到右侧面板中的“ JRE”选项卡

  3. 在“ VM参数”部分中将此粘贴

    -Duser.timezone=GMT

  4. 然后应用->运行


8

从连续集成服务器运行自动化测试时遇到了这个问题。我尝试将VM参数“ -Duser.timezone=GMT” 添加到构建参数,但这并不能解决问题。但是,添加环境变量“ TZ=GMT”确实为我解决了该问题。


2
“ TZ = GMT”环境变量也对我有用。我在使用shell脚本时遇到了问题,该shell脚本设置了运行单独的工具的环境,该工具又可以访问Oracle。
David Keener

1
有同样的问题,我在使用“ ant”时也必须使用“ TZ = Europe / Zurich”。有效!
ChristofKälin18年

2
这应该是最佳答案。所有其他答案均无效。
Alex Dembo

4

错误:

ORA-00604:递归SQL级别1发生错误ORA-01882:找不到时区区域

解决方案:在Centos中设置CIM。

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

添加以下Java参数:

JAVA_ARGS="${JAVA_ARGS} -Duser.timezone=EDT"

3

在Netbeans中

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

单击确定,然后重新运行您的程序。

注意:您还可以设置除UTC和GMT之外的其他时标。


2

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

JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false

我敢肯定,使用其他答案中的Java参数建议中的一项将以相同的方式工作。


2

我也同样面临类似的问题。

环境:

Linux,休眠项目,ojdbc6驱动程序,同时查询oracle 11g数据库。

解析度

在Linux机器中未设置TZ参数,该参数基本上告诉oracle时区。因此,在应用程序启动时添加了导出语句“ export TZ = UTC”后,解决了我的问题。

UTC->将accorind更改为您的时区。


2

如果JDeveloper中存在此问题:更改模型和视图项目的项目属性->运行/调试->默认配置文件->编辑,添加以下运行选项:-Duser.timezone = Asia / Calcutta

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

select TZNAME from V$TIMEZONE_NAMES;

除此之外,您还需要检查jdev.conf和JDeveloper-> Application菜单-> Default Project Propertes-> Run / Debug-> Default Profile-> Run Options中的时区设置。


1

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

ORA-00604: error occurred at recursive SQL level 1 

ORA-01882: timezone region not found

我提到了许多论坛,它们要求将时区包含在Project属性和Default Project属性的Java选项(运行/调试/配置文件)中, -Duser.timezone="+02:00" b,但是它对我不起作用。最后,以下解决方案为我工作。

将以下行添加到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. 须藤ln -sf / usr / share / zoneinfo / America / Phoenix / etc / localtime

要弄清楚时区值,请尝试

ls /usr/share/zoneinfo

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

设置完这些后,重新启动计算机,然后重试。


2
对我来说,确保正确设置/ etc / sysconfig / clock和/ etc / localtime链接是解决ORA-01882问题的先决条件。
David Keener

1

尝试在OBIEE上建立与Oracle数据库的连接时遇到了相同的问题。我将Windows时区从(GMT + 01:00)中西部非洲更改为(GMT + 01:00)布鲁塞尔,哥本哈根,马德里,巴黎。然后,我重启了计算机,一切正常。好像Oracle无法识别中西部非洲时区。


1

发生此问题的原因是试图连接到db的代码具有不在db中的时区。也可以通过将时区设置为以下或oracle db中可用的任何有效时区来解决。可以找到的有效时区从v $ version中选择*;

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


0

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

我希望这可以帮助某人


0

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

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

例如,印度时区是钦奈,加尔各答。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.