我正在从java应用程序访问Oracle数据库,当我运行我的应用程序时,我收到以下错误:
java.sql.SQLException: ORA-00604:递归 SQL 级别 1 时出错 ORA-01882:找不到时区区域
您也可以尝试检查 Oracle jdbc 驱动程序和 Oracle 数据库的版本。就在今天,我在使用 ojdbc6.jar(版本 11.2.0.3.0(连接到 Oracle 9.2.0.4.0 服务器时遇到了这个问题。将其替换为 ojdbc6.jar版本 11.1.0.7.0 解决了该问题。
我还设法使ojdbc6.jar版本11.2.0.3.0连接没有错误,通过在文件oracle/jdbc/defaultConnectionProperties.properties(在jar内(中添加oracle.jdbc.timezoneAsRegion=false
。在这里找到这个解决方案(断开的链接(
然后,可以将-Doracle.jdbc.timezoneAsRegion=false
添加到命令行,或在使用此表示法的配置文件中AddVMOption -Doracle.jdbc.timezoneAsRegion=false
。
您也可以以编程方式执行此操作,例如使用 System.setProperty
.
在某些情况下,如果允许,可以基于每个连接添加环境变量(SQL 开发人员在"高级"连接属性中允许这样做;我验证了它在连接到没有问题的数据库并使用数据库链接到有问题的数据库时可以工作。
在Windows下的SQL开发人员安装中,转到目录
C:Program Filessqldevelopersqldeveloperbin
并添加
AddVMOption -Duser.timezone=CET
以提交sqldeveloper.conf
.
我得到的错误:
来自 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;
}
现在它正在工作!!
更新文件 oracle/jdbc/defaultConnectionProperties.properties 在你正在使用的任何版本的库(即在你的 jar 内(中,以包含以下行:
oracle.jdbc.timezoneAsRegion=false
发生的情况是,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,而在发送时间偏移量之前。这种"发送已知 ID"的问题在于,客户端不会检查服务器上存在的时区版本/内容,而是有自己的列表。
Oracle 支持文章 [ID 1068063.1] 中对此进行了说明。
似乎这也取决于客户端操作系统,Ubuntu 的 Etc/UTC 比 RHEL 或 Windows 更有可能失败。我想这是由于一些规范化,但我还没有弄清楚到底是什么。
-
在 Eclipse 中运行 ->运行配置
-
在那里转到右侧面板中的 JRE 选项卡
-
在 VM 参数部分中粘贴此内容
-Duser.timezone=GMT
-
然后应用 ->运行
从持续集成服务器运行自动测试时遇到了这个问题。我尝试将 VM 参数"-Duser.timezone=GMT
"添加到构建参数中,但这并没有解决问题。但是,添加环境变量" TZ=GMT
"确实为我修复了它。
我在Tomcat上遇到了这个问题。 在$CATALINA_BASE/bin/setenv.sh
中设置以下内容解决了该问题:
JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false
我敢肯定,使用其他答案中的 Java 参数建议之一会以相同的方式工作。
错误:
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"
在 Netbeans 中,
- 右键单击您的项目 ->属性
- 转到"运行"(在"类别"下( 在虚拟机选项下输入 -Duser.timezone=
- UTC 或 -Duser.timezone=GMT。
单击"确定",然后重新运行程序。
注意:您也可以设置为UTC和GMT以外的其他时间石。
如果此问题在 JDeveloper 中:更改模型和视图项目的项目属性 ->运行/调试 ->默认配置文件 ->编辑添加以下运行选项:-Duser.时区=亚洲/加尔各答
确保从数据库中获取上述时区值,如下所示:
select TZNAME from V$TIMEZONE_NAMES;
除此之外,您还需要检查 jdev.conf 以及 JDeveloper -> 应用程序菜单 -> 默认项目属性 -> 运行/调试 -> 默认配置文件 -> 运行选项中的时区设置。
我也同样面临类似的问题。
环境:
Linux,休眠项目,ojdbc6驱动程序,同时查询oracle 11g数据库。
分辨率
在Linux机器中没有设置TZ参数,这基本上告诉预言机时区。因此,在应用程序启动时添加导出语句"导出TZ=UTC"后解决了我的问题。
UTC--> 更改时区。
我在尝试在OBIEE上与Oracle db建立连接时遇到了同样的问题。我将 Windows 时区从 (GMT+01:00( 中西部非洲更改为 (GMT+01:00( 布鲁塞尔、哥本哈根、马德里、巴黎。然后我重新启动了我的电脑,它工作得很好。甲骨文似乎无法识别非洲中西部时区。
发生是因为尝试连接到数据库的代码具有不在数据库中的时区。也可以通过设置如下所示的时区或 oracle 数据库中可用的任何有效时区来解决。可以找到的有效时区 从 v$version 中选择 *;
System.setProperty("user.timezone", "America/New_York"(;TimeZone.setDefault(null(;
当我尝试在JDeveloper中创建连接时,我也遇到了同样的问题。我们的服务器位于不同的时区,因此引发了以下错误:
ORA-00604: error occurred at recursive SQL level 1
ORA-01882: timezone region not found
我参考了许多论坛,这些论坛要求在项目属性和默认项目属性的 Java 选项(运行/调试/配置文件(中包含时区-Duser.timezone="+02:00"
但它对我不起作用。最后,以下解决方案对我有用。
将以下行添加到 JDeveloper 的配置文件 (jdev.conf( 中。
AddVMOption -Duser.timezone=UTC+02:00
该文件位于">
就我而言,我可以通过将"TZR"更改为"TZD"来使查询工作。
String query = "select * from table1 to_timestamp_tz(origintime,'dd-mm-yyyy hh24:mi:ss TZD') between ? and ?";
我能够通过在我的 linux 系统 (Centos6.5( 中设置时区来解决同样的问题。
转贴自
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html
-
在
/etc/sysconfig/clock
中设置时区,例如设置为 ZONE="美国/Los_Angeles"> -
sudo ln -sf/usr/share/zoneinfo/America/Phoenix/etc/localtime
要计算时区值,请尝试
ls /usr/share/zoneinfo
,然后查找代表您所在时区的文件。
设置这些后,重新启动计算机,然后重试。
使用 Eclipse 和遥远的 Oracle 数据库时遇到同样的问题,更改我的系统时区以匹配数据库服务器的时区解决了这个问题。更改系统时区后重新启动计算机。
我希望这可以帮助某人
java.sql.SQLException: ORA-00604: 递归 SQL 出错 级别 1 ORA-01882:未找到时区区域
对于此类错误,只需将系统时间更改为您所在国家/地区的标准 GMT 格式即可
例如,印度时区是钦奈,加尔各答。
当您使用错误版本的 OJDBC jar 时发生。
您需要使用11.2.0.4
就我而言,我使用此命令在我的操作系统级别(ubuntu(设置时区。
Timedatectl set-timezone {timezone}
例如
timedatectl set-timezone Africa/Kampala
这可能有点晚了,但它可能会帮助某人。我在使用弹簧引导应用程序时遇到了此问题,并且无法连接到 Oracle DB。
错误:
java.sql.SQLException: ORA-00604: 递归 SQL 级别 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
工作解决方案来自以下链接
工作解决方案网址
编辑
<小时 />在 DBA 用缺少的时区补丁修补预言机之后,上述 (...时区作为区域=false(不再需要。
对于 Spring-boot 应用程序 -//在下面添加两行
@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);
}
}