簡體   English   中英

Java中的參數化Oracle SQL查詢?

[英]Parameterized Oracle SQL query in Java?

我一直試圖弄清楚為什么下面的代碼沒有在我的ResultSet中生成任何數據:

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo");
ResultSet rs = prepStmt.executeQuery();

另一方面,以下運行正常:

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = 'Waterloo' ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
ResultSet rs = prepStmt.executeQuery();

SCHOOL的數據類型為CHAR(9字節)。 我也嘗試過:而不是setString:

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
String school = "Waterloo";
Reader reader = new CharArrayReader(school.toCharArray());
prepStmt.setCharacterStream(1, reader, 9);
prepStmt.setString(1, "Waterloo");
ResultSet rs = prepStmt.executeQuery();

我完全堅持接下來要調查的內容; Eclipse調試器表示即使在setString或setCharacterStream之后,SQL查詢也不會改變。 我不確定是不是因為設置參數不起作用,或者調試器根本無法獲取PreparedStatement中的更改。

任何幫助將不勝感激,謝謝!

我認為問題是你的數據類型是CHAR(9)而“滑鐵盧”只有8個字符。 我假設這會返回預期的結果(LIKE和%)。 或者添加缺少的空間。

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();

如果你的字符串具有靈活的長度,最好的方法是使用varchar而不是char。 然后PreparedStatement將按預期工作。

解決方法是使用Oracle特定的setFixedCHAR方法(但如果可能,最好將數據類型更改為varchar)。

以下內容來自Oracle的PreparedStatement JavaDoc:


數據庫中的CHAR數據填充到列寬。 這導致使用setCHAR()方法將字符數據綁定到SELECT語句的WHERE子句中的限制 - WHERE子句中的字符數據也必須填充到列寬以在SELECT語句中生成匹配。 如果您不知道列寬,這尤其麻煩。

setFixedCHAR()可以解決這個問題。 此方法執行非填充比較。

筆記:

  • 請記住將准備好的語句對象強制轉換為OraclePreparedStatement以使用setFixedCHAR()方法。
  • 對於INSERT語句,不需要使用setFixedCHAR()。 數據庫在插入數據時始終自動將數據填充到列寬。

以下示例演示了setString(),setCHAR()和setFixedCHAR()方法之間的區別。

 // Schema is : create table my_table (col1 char(10)); // insert into my_table values ('JDBC'); PreparedStatement pstmt = conn.prepareStatement ("select count() from my_table where col1 = ?"); ResultSet rs; pstmt.setString (1, "JDBC"); // Set the Bind Value rs = pstmt.executeQuery(); // This does not match any row // ... do something with rs CHAR ch = new CHAR("JDBC ", null); ((OraclePreparedStatement)pstmt).setCHAR(1, ch); // Pad it to 10 bytes rs = pstmt.executeQuery(); // This matches one row // ... do something with rs ((OraclePreparedStatement)pstmt).setFixedCHAR(1, "JDBC"); rs = pstmt.executeQuery(); // This matches one row // ... do something with rs 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM