sql >> Base de Datos >  >> RDS >> Oracle

¿Consulta Oracle SQL parametrizada en Java?

Creo que el problema es que su tipo de datos es CHAR (9) y "Waterloo" tiene solo 8 caracteres. Supongo que esto devolvería los resultados esperados (LIKE y %). O agregue el espacio que falta.

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

La mejor manera sería usar varchar en lugar de char si sus cadenas tienen una longitud flexible. Luego, PreparedStatement funcionaría como se esperaba.

Una solución sería usar el método setFixedCHAR específico de Oracle (pero es mejor cambiar el tipo de datos a varchar si es posible).

Lo siguiente es de PreparedStatement JavaDoc de Oracle:

Los datos CHAR en la base de datos se rellenan al ancho de la columna. Esto conduce a una limitación en el uso del método setCHAR() para enlazar datos de caracteres en la cláusula WHERE de una declaración SELECT:los datos de caracteres en la cláusula WHERE también deben rellenarse con el ancho de la columna para producir una coincidencia en la declaración SELECT. Esto es especialmente problemático si no conoce el ancho de la columna.

setFixedCHAR() soluciona esto. Este método ejecuta una comparación sin relleno.

Notas:

  • Recuerde enviar su objeto de declaración preparada a OraclePreparedStatement para usar el método setFixedCHAR().
  • No es necesario usar setFixedCHAR() para una instrucción INSERT. La base de datos siempre rellena automáticamente los datos al ancho de la columna a medida que los inserta.

El siguiente ejemplo demuestra la diferencia entre los métodos setString(), setCHAR() y 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