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更有可能失败。 我想这是由于一些正常化,但我还没有弄清楚究竟是什么。
-
在eclipse中运行 – > 运行configuration
-
在那里去右侧面板的JRE标签
-
在虚拟机参数部分粘贴这个
-Duser.timezone=GMT
-
然后应用 – >运行
错误: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中,
- 右键单击您的项目 – >属性
- 转到运行(在类别下)
- 在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)。