1. 程式人生 > >Oracle JDBC通過佔位符可以查詢可變長欄位,不可查詢固定長度欄位

Oracle JDBC通過佔位符可以查詢可變長欄位,不可查詢固定長度欄位

這個問題在半年前,花了我兩天的時間才解決,現在剛好想起來,順便記錄一下以防忘了。

通過jdbc,預編譯的sql,無法查詢到固定長度的欄位。

用例子說話:

建立一個表,只有一個欄位,長度為固定的char型別。並插入一條資料。

create table tblchar

(  name char(20) );

在Java程式碼中使用預編譯的SQL查詢,無法查詢到結果。而使用拼接的SQL,可以正常查詢。

 1 public static void main(String[] args) {
 2         try {
 3             Class.forName("oracle.jdbc.driver.OracleDriver");
 4             String url = "jdbc:oracle:thin:@localhost:1521:XE";
5 Connection connection = DriverManager.getConnection(url, "sys as sysdba", 6 "Changeme123"); 7 8 PreparedStatement statement = connection.prepareStatement( 9 "select * from tblchar t where t.name = ?"); 10 statement.setString(1, "a");
11 12 ResultSet resultSet = statement.executeQuery(); 13 System.out.println("first query result is :"); 14 while (null != resultSet && resultSet.next()) { 15 System.out.println(resultSet.getString(1)); 16 } 17 PreparedStatement statement2 = connection.prepareStatement(
18 "select * from tblchar t where t.name = 'a'"); 19 20 ResultSet resultSet2 = statement2.executeQuery(); 21 System.out.println("second query result is :"); 22 while (null != resultSet2 && resultSet2.next()) { 23 System.out.println(resultSet2.getString(1)); 24 } 25 connection.close(); 26 } catch (ClassNotFoundException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } catch (SQLException e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 } 33 }
View Code

執行結果如下:

可變長度的查詢過程略,無數實踐已證明是可以查詢的。

結論:

資料庫表在設計時,儘量少用固定長度。

1. 固定長度浪費空間 2. JDBC預編譯語句無法查詢結果。