Myslím, že problém je v tom, že váš datový typ je CHAR(9) a "Waterloo" má pouze 8 znaků. Předpokládám, že by to vrátilo očekávané výsledky (LIKE a %). Nebo přidejte chybějící místo.
String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();
Nejlepším způsobem by bylo použít varchar místo char, pokud mají vaše řetězce flexibilní délku. Potom by PreparedStatement fungoval podle očekávání.
Řešením by bylo použití metody setFixedCHAR specifické pro Oracle (ale pokud je to možné, je lepší změnit datový typ na varchar).
Následující text pochází z Oracle's PreparedStatement JavaDoc:
CHAR data v databázi jsou vyplněna na šířku sloupce. To vede k omezení při použití metody setCHAR() k navázání znakových dat do klauzule WHERE příkazu SELECT – znaková data v klauzuli WHERE musí být také doplněna o šířku sloupce, aby se dosáhlo shody v příkazu SELECT. To je obzvláště problematické, pokud neznáte šířku sloupce.
setFixedCHAR() to napraví. Tato metoda provede nevyplněné porovnání.
Poznámky:
- Nezapomeňte přenést připravený objekt příkazu do OraclePreparedStatement, abyste použili metodu setFixedCHAR().
- Pro příkaz INSERT není nutné používat setFixedCHAR(). Databáze při vkládání vždy automaticky doplní data na šířku sloupce.
Následující příklad ukazuje rozdíl mezi metodami setString(), setCHAR() a 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