[英]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:
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.