我正在从Java应用程序访问Oracle数据库,当我运行应用程序时出现以下错误:
java.sql.SQLException:ORA-00604:在递归SQL级别1发生错误ORA-01882:找不到时区区域
我正在从Java应用程序访问Oracle数据库,当我运行应用程序时出现以下错误:
java.sql.SQLException:ORA-00604:在递归SQL级别1发生错误ORA-01882:找不到时区区域
Answers:
您也可以尝试检查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 。
我得到的错误:
来自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;
}
现在它正在工作!
在用于包含以下行的任何版本的库中(即,在jar中)更新文件oracle / jdbc / defaultConnectionProperties.properties:
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”的问题在于,客户端不检查服务器上存在什么时区版本/内容,而是拥有自己的列表。
Oracle支持文章[ID 1068063.1]中对此进行了解释。
看来这也取决于客户端操作系统,与RHEL或Windows相比,Etc / UTC在Ubuntu上失败的可能性更大。我想这是由于某种标准化,但我还没有弄清楚到底是什么。
在Eclipse中运行 -> 运行配置
在那里,转到右侧面板中的“ JRE”选项卡
在“ VM参数”部分中将此粘贴
-Duser.timezone=GMT
然后应用->运行
从连续集成服务器运行自动化测试时遇到了这个问题。我尝试将VM参数“ -Duser.timezone=GMT
” 添加到构建参数,但这并不能解决问题。但是,添加环境变量“ TZ=GMT
”确实为我解决了该问题。
错误:
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中
单击确定,然后重新运行您的程序。
注意:您还可以设置除UTC和GMT之外的其他时标。
当我尝试在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”中。
就我而言,我可以通过将“ 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 =“ America / Los_Angeles”
须藤ln -sf / usr / share / zoneinfo / America / Phoenix / etc / localtime
要弄清楚时区值,请尝试
ls /usr/share/zoneinfo
并查找代表您的时区的文件。
设置完这些后,重新启动计算机,然后重试。