ORA-00604 ORA-12705

12

我在我的J2EE Web应用程序中遇到了这个错误。

java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-12705: Cannot access NLS data files or invalid environment specified

 oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:283)
 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:278)
 oracle.jdbc.driver.T4CTTIoauthenticate.receiveOauth(T4CTTIoauthenticate.java:785)
 oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:376)
 oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:441)
 oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
 oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
 oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:839)
 java.sql.DriverManager.getConnection(Unknown Source)
 java.sql.DriverManager.getConnection(Unknown Source)
 org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:133)
 org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
 org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
 org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142)
 org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85)
 org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1353)


 org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85)
 org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1353)

这个项目在我同事的电脑上能正常运行...我是说这个项目对他们有效,但是当我拿到他们的项目文件夹并在我的 Eclipse 上导入后,在运行时遇到了这个错误。JAR 文件已经与项目文件夹打包在一起。

我还创建了一个使用 Hibernate 的简单 J2EE 项目,但我遇到了同样的错误。 我尝试使用 PL/SQL Developer 对数据库服务器进行 ping 和浏览,没有任何问题。

11个回答

8
请尝试以下步骤:
  1. 检查NLS_LANG设置是否正确。在Windows系统中,它位于注册表的 \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 下。
  2. 检查Oracle客户端软件是否正确安装。
  3. 检查计算机上是否有多个Oracle主目录。如果有,请找到活动的一个并检查其是否正常工作。
  4. 如果已安装SQL*Plus,请使用它进行测试。Sql Developer之所以能够正常工作是因为它有自己的客户端安装。
编辑:
关于驱动程序,请查看此网站:Oracle Instant Client。您将在那里找到有关JDBC访问Oracle所需的最小驱动程序安装的文档。我不太了解这方面的知识,因为我使用的是.Net。 编辑2:
请参见此问题:NLS_LANG setting for JDBC thin driver。与您遇到的相同错误的问题是默认的NLS LANG区域设置未定义。引用如下:

NLS_LANG设置来自 java.util.Locale。因此,在连接之前,您需要进行类似于以下的调用:

  Locale.setDefault(Locale.<your locale here>);

我是否需要安装Oracle客户端才能连接我的Web应用程序?我认为我只需要在项目中包含ODBC驱动程序jar文件。 - cedric

8

我发现你可以将这两个参数传递给你的Java应用程序以解决此问题:

-Duser.country=en -Duser.language=en

您可以在环境变量级别上配置值(这取决于您的操作系统)。

7
我遇到了同样的问题。解决方法是在sqldeveloper.conf文件中添加国家和语言。
请打开以下文件:
\sqldeveloper\sqldeveloper\bin\sqldeveloper.conf

并添加以下内容:

AddVMOption -Duser.language=en
AddVMOption -Duser.region=us

以上方法就可以解决问题。
参考文献:http://forum.oradba.net/showthread.php?t=423&langid=1

对我来说有效。但那是火箭科学...我的意思是我怎么猜得到呢... - nikita
你是总督哈哈,两个小时后非常感谢你! - Joe Mwa
你救了我的一天。 - Burhan Ul Haqq Zahir

5

1

Oracle JDBC驱动程序在打开新连接后隐式执行以下语句:

ALTER SESSION SET NLS_LANGUAGE='language' NLS_TERRITORY='territory'

在我们的案例中,我们遇到了Oracle XE 11g和JDBC驱动程序中嵌入的默认语言/地域映射的问题:'ru'区域设置被映射到仅由Oracle EE支持的'CIS'地域,但Oracle XE仅支持'RUSSIA'地域。以下是我们解决此问题的方法:

-Doracle.jdbc.territoryMap="ru=RUSSIA;RU=RUSSIA"

有NLS_LANGUAGE选项(我们使用默认值没有问题):

-Doracle.jdbc.languageMap="ru=RUSSIAN;RU=RUSSIAN"

修复:从Java JDBC驱动程序的oracle.sql.converter.CharacterSetMetaData类获取常量ru=RUSSIAN


谢谢您的回答!在我的情况下,是System.setProperty("oracle.jdbc.territoryMap", "ru=RUSSIA;RU=CIS");这个赋值语句解决了问题(对于旧版的Oracle9i)。 - Toparvion

1

我找到了解决方案,我只需更改我的操作系统(Windows 7)的区域和语言设置,确保与 Oracle 的区域和语言相匹配。


1

如果你正在使用IntelljIDE进行编译,我建议你在配置模型中的VMoptions中添加以下选项。

AddVMOption -Duser.region=us. 

0

首先执行查询:

select userenv('LANGUAGE') from dual;`

这将为Oracle提供区域和语言。更改操作系统中的区域和语言,两者应该匹配。


0

更改我的计算机的区域设置和语言有助于解决这个问题。 我将区域设置更改为美国,语言更改为英语(美国)。


0

请检查JAVA_HOME系统变量,并验证它与您在项目和程序中使用的版本相同。


你应该提供更多关于这个变量的信息:在哪里找到它?它真正的作用是什么?等等。 - Maciej S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接