您好,欢迎访问一九零五行业门户网

java与Oracle异常中的乱码

/*
 * 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
可以看到,原来输出的错误信息是中文的,设置后错误信息为英文的了。这正是你需要的
其它类似信息

推荐信息