/*
* 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
可以看到,原來輸出的錯誤資訊是中文的,設定後錯誤資訊為英文的了。這正是你需要的