Oracle JDBC通過佔位符可以查詢可變長欄位,不可查詢固定長度欄位
阿新 • • 發佈:2019-02-14
這個問題在半年前,花了我兩天的時間才解決,現在剛好想起來,順便記錄一下以防忘了。
通過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";View Code5 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 }
執行結果如下:
可變長度的查詢過程略,無數實踐已證明是可以查詢的。
結論:
資料庫表在設計時,儘量少用固定長度。
1. 固定長度浪費空間 2. JDBC預編譯語句無法查詢結果。