Oracle
 sql >> Database >  >> RDS >> Oracle

Query Oracle SQL parametrizzata in Java?

Penso che il problema sia che il tuo tipo di dati è CHAR(9) e "Waterloo" ha solo 8 caratteri. Presumo che questo restituirebbe i risultati attesi (LIKE e %). Oppure aggiungi lo spazio mancante.

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

Il modo migliore sarebbe usare varchar invece di char se le tue stringhe hanno una lunghezza flessibile. Quindi PreparedStatement funzionerebbe come previsto.

Una soluzione alternativa sarebbe utilizzare il metodo setFixedCHAR specifico di Oracle (ma è meglio cambiare il tipo di dati in varchar, se possibile).

Quanto segue è tratto da PreparedStatement JavaDoc di Oracle:

I dati CHAR nel database vengono riempiti in base alla larghezza della colonna. Ciò porta a una limitazione nell'uso del metodo setCHAR() per associare i dati dei caratteri nella clausola WHERE di un'istruzione SELECT:anche i dati dei caratteri nella clausola WHERE devono essere riempiti alla larghezza della colonna per produrre una corrispondenza nell'istruzione SELECT. Ciò è particolarmente problematico se non si conosce la larghezza della colonna.

setFixedCHAR() risolve questo problema. Questo metodo esegue un confronto non riempito.

Note:

  • Ricordati di eseguire il cast dell'oggetto istruzione preparato in OraclePreparedStatement per utilizzare il metodo setFixedCHAR().
  • Non è necessario utilizzare setFixedCHAR() per un'istruzione INSERT. Il database riempie sempre automaticamente i dati in base alla larghezza della colonna quando li inserisce.

L'esempio seguente mostra la differenza tra i metodi setString(), setCHAR() e 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