Myślę, że problem polega na tym, że twój typ danych to CHAR(9), a „Waterloo” ma tylko 8 znaków. Zakładam, że zwróci to oczekiwane wyniki (LIKE i %). Lub dodaj brakujące miejsce.
String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();
Najlepszym sposobem byłoby użycie varchar zamiast char, jeśli Twoje ciągi mają elastyczną długość. Wtedy PreparedStatement działał zgodnie z oczekiwaniami.
Obejściem byłoby użycie specyficznej dla Oracle metody setFixedCHAR (ale lepiej zmienić typ danych na varchar, jeśli to możliwe).
Poniżej znajduje się dokument JavaDoc PreparedStatement firmy Oracle:
Dane CHAR w bazie danych są dopełniane do szerokości kolumny. Prowadzi to do ograniczenia używania metody setCHAR() do wiązania danych znakowych z klauzulą WHERE instrukcji SELECT — dane znakowe w klauzuli WHERE muszą być również dopełnione do szerokości kolumny, aby uzyskać dopasowanie w instrukcji SELECT. Jest to szczególnie kłopotliwe, jeśli nie znasz szerokości kolumny.
setFixedCHAR() rozwiązuje ten problem. Ta metoda wykonuje porównanie bez wypełnienia.
Uwagi:
- Pamiętaj, aby rzutować obiekt przygotowanej instrukcji na OraclePreparedStatement, aby użyć metody setFixedCHAR().
- Nie ma potrzeby używania setFixedCHAR() dla instrukcji INSERT. Baza danych zawsze automatycznie dopasowuje dane do szerokości kolumny podczas ich wstawiania.
Poniższy przykład ilustruje różnicę między metodami setString(), setCHAR() i 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