Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Parametrisierte Oracle SQL-Abfrage in Java?

Ich denke, das Problem ist, dass Ihr Datentyp CHAR (9) ist und "Waterloo" nur 8 Zeichen hat. Ich gehe davon aus, dass dies die erwarteten Ergebnisse zurückgeben würde (LIKE und %). Oder fügen Sie das fehlende Leerzeichen hinzu.

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

Der beste Weg wäre, varchar anstelle von char zu verwenden, wenn Ihre Strings eine flexible Länge haben. Dann würde das PreparedStatement wie erwartet funktionieren.

Eine Problemumgehung wäre die Verwendung der Oracle-spezifischen setFixedCHAR-Methode (aber es ist besser, wenn möglich den Datentyp in varchar zu ändern).

Folgendes stammt aus Oracles PreparedStatement JavaDoc:

CHAR-Daten in der Datenbank werden auf die Spaltenbreite aufgefüllt. Dies führt zu einer Einschränkung bei der Verwendung der setCHAR()-Methode zum Binden von Zeichendaten in die WHERE-Klausel einer SELECT-Anweisung – die Zeichendaten in der WHERE-Klausel müssen auch auf die Spaltenbreite aufgefüllt werden, um eine Übereinstimmung in der SELECT-Anweisung zu erzeugen. Dies ist besonders problematisch, wenn Sie die Spaltenbreite nicht kennen.

setFixedCHAR() behebt dies. Diese Methode führt einen nicht aufgefüllten Vergleich durch.

Hinweise:

  • Denken Sie daran, Ihr vorbereitetes Statement-Objekt in OraclePreparedStatement umzuwandeln, um die Methode setFixedCHAR() zu verwenden.
  • Es besteht keine Notwendigkeit, setFixedCHAR() für eine INSERT-Anweisung zu verwenden. Die Datenbank füllt die Daten beim Einfügen immer automatisch auf die Spaltenbreite auf.

Das folgende Beispiel demonstriert den Unterschied zwischen den Methoden setString(), setCHAR() und 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