ORA-01882: timezone region not found

我正在从一个 java 应用程序访问 Oracle 数据库,当我运行我的应用程序时,我得到以下错误:

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

229307 次浏览

您还可以尝试检查 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/defaultConnectionProperties.properties (在 jar 内部)中添加 oracle.jdbc.timezoneAsRegion=false,使 ojdbc6.jar 版本11.2.0.3.0连接没有错误。找到了这个解决方案 给你(断链)

然后,可以在命令行中添加 -Doracle.jdbc.timezoneAsRegion=false,或者在使用此表示法的配置文件中添加 AddVMOption -Doracle.jdbc.timezoneAsRegion=false

您也可以通过编程方式完成这项工作,例如使用 System.setProperty

在某些情况下,如果允许的话,你可以在每个连接的基础上添加环境变量(SQL Developer 在“ Advanced”连接属性中允许这样做,当连接到一个没有问题的数据库并使用一个数据库链接到一个有问题的数据库时,我验证了它的工作原理)。

错误,我得到:

错误来自 db _ connect. java —— > > java.SQL.SQLException: ORA-00604: 错误发生在递归 SQL 级别1 ORA-01882: 未找到时区区域

ORA-00604: 在递归 SQL 级别1ORA-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;
}

现在起作用了! !

  1. 在日食中走 快跑-> 运行配置

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

  3. VM 参数部分粘贴这个

    -Duser.timezone=GMT

  4. 然后应用-> 运行

在网豆里,

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

单击“确定”,然后重新运行程序。

注意: 除了 UTC 和 GMT,你也可以设置其他的时间。

Windows 下的 SQL-Developer 安装显示在目录下

C:\Program Files\sqldeveloper\sqldeveloper\bin

然后加

AddVMOption -Duser.timezone=CET

to file sqldeveloper.conf.

在任何版本的库中(比如在 jar 中)更新文件 oracle/jdbc/defaultConnectionProperties.properties,以包含下面的行:

oracle.jdbc.timezoneAsRegion=false

发生的情况是,JDBC 客户机将时区 ID 发送给服务器。服务器需要知道那个区域。你可以问问

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

我有一些知道‘ Eetc/UTC’和‘ UTC’(tzfile 版本18)的数据库服务器,但其他服务器只知道‘ UTC’(tz 版本11)。

SELECT FILENAME,VERSION from V$TIMEZONE_FILE;

There is also different behavior on the JDBC client side. Starting with 11.2 the driver will sent the zone IDs if it is "known" to Oracle, whereas before it sent the time offset. The problem with this "sending of known IDs" is, that the client does not check what timezone version/content is present on the server but has its own list.

Oracle 支持文章[ ID 1068063.1]对此进行了解释。

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

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

ORA-00604: error occurred at recursive SQL level 1


ORA-01882: timezone region not found

我参考了很多论坛,这些论坛要求在项目属性和默认项目属性的 Java 选项(Run/Debug/Profile)中包含时区作为 -Duser.timezone="+02:00"b,但这对我没有用。最后,下面的解决方案对我有效。

将以下代码行添加到 JDeveloper 的配置文件(Jdev.conf)。

AddVMOption -Duser.timezone=UTC+02:00

该文件位于“ < oracle install root > Middleware jdeveloperjdev bin jdev.conf”中。

I had this problem when running automated tests from a continuous integration server. I tried adding the VM argument "-Duser.timezone=GMT" to the build parameters, but that didn't solve the problem. However, adding the environment variable "TZ=GMT" did fix it for me.

如果这个问题出现在 JDeveloper 中: 更改模型和视图项目的项目属性-> run/debug-> default profile-> edit 添加以下 run 选项: 时区 = 亚洲/加尔各答

确保从数据库中提取上述时区值如下:

select TZNAME from V$TIMEZONE_NAMES;

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

通过在 Linux 系统中设置时区(Centos6.5) ,我能够解决同样的问题。

Reposting from

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

and look for the file that represents your timezone.

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

在我的例子中,我可以通过将“ TZR”改为“ TZD”来使查询工作。

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

面对使用 Eclipse 和远程 Oracle 数据库的同样问题,修改 系统时区系统时区以匹配数据库服务器的时区就解决了这个问题。 Re-start the machine after changing system time zone.

I hope this can help someone

ERROR :

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"

我在使用 Tomcat 时遇到了这个问题:

JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false

我确信使用来自其他答案的 Java 参数建议也会以同样的方式工作。

SQLException: ORA-00604: 递归 SQL 时发生错误 level 1 ORA-01882: timezone region not found

对于这种类型的错误,只需改变您的系统时间到您的国家的标准 GMT 格式

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

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

环境:

Linux, hibernate project, ojdbc6 driver while querying oracle 11g database.

决心

在 linux 机器中没有设置 TZ 参数,这基本上告诉 Oracle 有关时区的信息。 因此,在应用程序启动时添加导出语句“ export TZ = UTC”后,问题就解决了。

根据你所在的时区更改。

I had the same problem when trying to make a connection on OBIEE to Oracle db. I changed my Windows timezone from (GMT+01:00) West Central Africa to (GMT+01:00) Brussels, Copenhagen, Madrid, Paris. Then I rebooted my computer and it worked just fine. 甲骨文似乎无法识别非洲中西部的时区。

当尝试连接到 db 的代码有一个不在 db 中的时区时,就会发生这个问题。 还可以通过将时区设置为以下或 Oracle db 中的任何有效时区来解决这个问题。 有效时区,可从 v $version 中选择 * ;

SetProperty (“ user.timezone”,“ America/New _ York”) ; SetDefault (null) ;

Happens when you use the wrong version of OJDBC jar.

你需要利用 11.2.0.4

对于我的情况,我使用这个命令在操作系统级别(ubuntu)设置时区。

Timedatectl set-timezone { timezone }

比如说,

timedatectl set-timezone Africa/Kampala

这可能有点晚,但它可能帮助某人。 我在处理 Spring-boot 应用程序时遇到了这个问题,无法连接到 OracleDB。

错误:

java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1

ORA-01882: 未找到时区区域

SELECT DBTIMEZONE FROM dual; -- This return: +00:00
timedatectl #The OS on the other hand returned correct time and timezone

由于我不是一个系统管理员,也不允许更改系统配置,所以我必须在代码中应用一个变通方法。

spring.datasource.hikari.data-source-properties.oracle.jdbc.timezoneAsRegion=false
#Added the above into the application property file

工作解决方案来自下面的链接

工作解决方案 URL

剪辑


在 DBA 用缺少的时区补丁修补 Oracle 之后,就不再需要上面的(... timezoneAsArea = false)了。

对于 Spring-Boot Application-//添加以下两行

@SpringBootApplication
public class  Application {
public static void main(String[] args) {
// add below two lines
System.out.println("Setting the timezone"+TimeZone.getTimeZone("GMT+9:00").getID());
TimeZone.setDefault(TimeZone.getTimeZone("GMT+9:00"));
SpringApplication.run(Application.class, args);
}
}