Ik denk dat het probleem is dat uw datatype CHAR (9) is en dat "Waterloo" slechts 8 tekens heeft. Ik neem aan dat dit de verwachte resultaten zou opleveren (LIKE en %). Of voeg de ontbrekende spatie toe.
String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();
De beste manier is om varchar te gebruiken in plaats van char als je strings een flexibele lengte hebben. Dan zou de PreparedStatement werken zoals verwacht.
Een tijdelijke oplossing zou zijn om de Oracle-specifieke setFixedCHAR-methode te gebruiken (maar het is beter om het datatype indien mogelijk te wijzigen in varchar).
Het volgende komt uit Oracle's PreparedStatement JavaDoc:
CHAR-gegevens in de database worden opgevuld tot de kolombreedte. Dit leidt tot een beperking bij het gebruik van de methode setCHAR() om tekengegevens te binden aan de WHERE-component van een SELECT-instructie - de tekengegevens in de WHERE-component moeten ook worden opgevuld met de kolombreedte om een overeenkomst in de SELECT-instructie te produceren. Dit is vooral lastig als u de kolombreedte niet weet.
setFixedCHAR() verhelpt dit. Deze methode voert een niet-opgevulde vergelijking uit.
Opmerkingen:
- Vergeet niet om uw voorbereide instructieobject naar OraclePreparedStatement te casten om de methode setFixedCHAR() te gebruiken.
- Het is niet nodig om setFixedCHAR() te gebruiken voor een INSERT-instructie. De database vult de gegevens altijd automatisch in tot de kolombreedte wanneer ze worden ingevoegd.
Het volgende voorbeeld laat het verschil zien tussen de methoden setString(), setCHAR() en 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