/*
* test.java 2008-7-30
*
*/
import java.sql.connection;
import java.sql.drivermanager;
import java.sql.resultset;
import oracle.jdbc.oracledriver;
public class test {
public static void main(string[] args) throws exception {
drivermanager.registerdriver(new oracledriver());
// 正常
connection conn = getconnection();
resultset rs = conn.createstatement().executequery(
app2db(select '123abc我是谁?' from dual));
rs.next();
// 打印123abc我是谁?
system.out.println(db2app(rs.getstring(1)));
// 异常
// 因该打印ora-00921: unexpected end of sql command
// 结果打印ora-00921: sql
try {
conn.createstatement().executequery(select 1 from dual where);
} catch (exception e) {
system.out.println(e.getmessage());
}
// 因该打印ora-00920: invalid relational operator
// 结果打印ora-00920:
try {
conn.createstatement().executequery(select 1 from dual where 1);
} catch (exception e) {
system.out.println(e.getmessage());
}
// 因该打印ora-00904: x: invalid identifier
// 结果打印ora-00904: x:
try {
conn.createstatement().executequery(select x from x);
} catch (exception e) {
system.out.println(e.getmessage());
}
}
private static string app2db(string str) throws exception {
return new string(str.getbytes(), iso-8859-1);
}
private static string db2app(string str) throws exception {
return new string(str.getbytes(iso-8859-1));
}
private static connection getconnection() throws exception {
return drivermanager.getconnection(jdbc:oracle:thin:......);
}
}
解决方法:
你可以考虑设置oracle客户端所在的机器(也是你的应用程序运行的机器)的nls_lang环境变量来绕开这个问题
我在自己的机器上做了个测试,效果如下:
系统环境
windows 2003简体中文版,oracle 10g
操作步骤
1.执行cmd.exe开启一个命令行窗口
2.执行sqlplus username/password进入sql plus命令提示符
3.执行如下sql语句
sql代码
select 'x' from dua;
select 'x' from dua;
注意dua是我故意写错的(dual少了其中的l),以便得到一个oracle异常
这时可以看到错误信息如下:
引用
第 1 行出现错误:
ora-00942: 表或视图不存在
4.执行quit退出sql plus命令提示符
5.在操作系统命令行提示符执行如下命令
java代码
set nls_lang=american_america.we8iso8859p1
set nls_lang=american_america.we8iso8859p1
6.重复第2、3步骤
这时可以看到错误信息如下:
引用
error at line 1:
ora-00942: table or view does not exist
可以看到,原来输出的错误信息是中文的,设置后错误信息为英文的了。这正是你需要的