Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Consulta Oracle SQL parametrizada em Java?


Acho que o problema é que seu tipo de dados é CHAR(9) e "Waterloo" tem apenas 8 caracteres. Presumo que isso retornaria os resultados esperados (LIKE e %). Ou adicione o espaço que falta.
String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();

A melhor maneira seria usar varchar em vez de char se suas Strings tiverem um comprimento flexível. Em seguida, o PreparedStatement funcionaria conforme o esperado.

Uma solução alternativa seria usar o método setFixedCHAR específico do Oracle (mas é melhor alterar o tipo de dados para varchar, se possível).

O seguinte é do PreparedStatement JavaDoc da Oracle:


Os dados CHAR no banco de dados são preenchidos com a largura da coluna. Isso leva a uma limitação no uso do método setCHAR() para vincular dados de caracteres à cláusula WHERE de uma instrução SELECT -- os dados de caracteres na cláusula WHERE também devem ser preenchidos com a largura da coluna para produzir uma correspondência na instrução SELECT. Isso é especialmente problemático se você não souber a largura da coluna.
setFixedCHAR() corrige isso. Este método executa uma comparação não preenchida.

Notas:
  • Lembre-se de converter seu objeto de instrução preparado para OraclePreparedStatement para usar o método setFixedCHAR().
  • Não há necessidade de usar setFixedCHAR() para uma instrução INSERT. O banco de dados sempre preenche automaticamente os dados na largura da coluna à medida que os insere.

O exemplo a seguir demonstra a diferença entre os métodos 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