欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

ORA-12705: Cannot access NLS data files or invalid environme

程序员文章站 2022-06-08 23:23:26
...

ant 1.8.2部署在241机器,oracle 11g部署在242机器上,今天用ant 1.8.2 通过oracle驱动向oracle 11g的环境插入数据时报下面的错误

ant 1.8.2部署在241机器,Oracle 11g部署在242机器上,今天用ant 1.8.2 通过oracle驱动向oracle 11g的环境插入数据时报下面的错误:

builddb:

BUILD FAILED
/home/build.xml:10: java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-12705: Cannot access NLS data files or invalid environment specified

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:28
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:278)
at oracle.jdbc.driver.T4CTTIoauthenticate.receiveOauth(T4CTTIoauthenticate.java:785)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:362)
at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:414)
at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:165)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
at org.apache.tools.ant.taskdefs.JDBCTask.getConnection(JDBCTask.java:370)
at org.apache.tools.ant.taskdefs.SQLExec.getConnection(SQLExec.java:942)
at org.apache.tools.ant.taskdefs.SQLExec.execute(SQLExec.java:614)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
at java.lang.reflect.Method.invoke(libgcj.so.7rh)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:390)
at org.apache.tools.ant.Target.performTasks(Target.java:411)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
at org.apache.tools.ant.Main.runBuild(Main.java:809)
at org.apache.tools.ant.Main.startAnt(Main.java:217)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)

Total time: 2 seconds

根据“ ORA-12705”错误号,发现很多人给出了下面的解决方案:

.检查以下变量是否设置正确(invalid environment specified)
NLS_LANG, ORA_NLSxx, or ORACLE_HOME

2.检查$ORACLE_HOME/nls/data目录中的nlb文件(NLS data files)是否损坏,可以先把文件备份,再从其他相同的环境中copy这些文件

解决方法1排除了,,原因是以前是好好的最近也未曾改过环境变量.
查找$ORACLE_HOME目录有了惊人的发现,让俺既是惊喜又是振奋,惊喜的是终于发现了NLS目录丢失了,振奋的是自己还有一台机器也安装有Oracle11g. 看来这年头操作系统也靠不近了,不用说copy一份过来。

根据上述的解决方案,检查oracle服务器(242)机器“NLS_LANG, ORA_NLSxx, or ORACLE_HOME”参数,发现前两个参数没有设置,于是设置这两个参数,设置完后,问题依旧(重启机器后仍然没有解决问题)。

于是找了第三台机器(记为243机器),在243机器上执行同样的ant脚本,发现可以正确执行。初步怀疑是241机器和243机器的环境变量不同造成的,通过env命令,比较两台机器的环境变量,发现243机器设置了java_home,而241机器没有设置java_home,于是乎快速设置java_home的值(java_home的设置参考: )。之后,断掉以前的连接,新建一个连接,执行ant命令,数据插入成功。

总结:这里走了弯路,主要是ORA-12705的错误给人太多的错误信息了,期间尝试读过jdbc的驱动,没有发现什么特别的问题。在关键信息解决不了问题的时候,笨方法(比较法)往往还是很能凑效的。