Pregunta

He estado tratando de averiguar por qué el siguiente código no está generando ningún dato en mi conjunto de resultados:

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

Por otro lado, los siguientes se ejecuta correctamente:

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = 'Waterloo' ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
ResultSet rs = prepStmt.executeQuery();

El tipo de datos para la escuela es CHAR (9 Byte). En lugar de setString, también probé:

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL = ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
String school = "Waterloo";
Reader reader = new CharArrayReader(school.toCharArray());
prepStmt.setCharacterStream(1, reader, 9);
prepStmt.setString(1, "Waterloo");
ResultSet rs = prepStmt.executeQuery();

estoy completamente atascado en lo siguiente para investigar; el depurador de Eclipse dice que la consulta SQL no cambia incluso después de setString o setCharacterStream. No estoy seguro de si es porque la configuración de parámetros no está funcionando, o si el depurador simplemente no puede recoger los cambios en el PreparedStatement.

Cualquier ayuda será muy apreciada, gracias!

¿Fue útil?

Solución

Creo que el problema es que el tipo de datos es CHAR (9) y "Waterloo" tiene sólo 8 caracteres. Asumo que esto sería devolver los resultados esperados y (como%). O añadir 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 mediante el uso de varchar en lugar de carbón si sus cadenas tienen una longitud flexible. A continuación, el PreparedStatement funcionaría como se esperaba.

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

El siguiente es de JavaDoc PreparedStatement de Oracle:


datos CHAR en la base de datos se rellena a la anchura de la columna. Esto conduce a una limitación en el uso del método setCHAR () para datos de caracteres se unen en la cláusula WHERE de una instrucción SELECT - los datos de caracteres en la cláusula WHERE también estarán rellenas para el ancho de columna para producir un partido en la instrucción SELECT. Esto es especialmente problemático si usted no sabe el ancho de columna.

setFixedCHAR () remedios esto. Este método realiza una comparación no acolchada.

Notas:

  • Recuerde que debe emitir su objeto de declaración preparado para OraclePreparedStatement utilizar el método setFixedCHAR ().
  • No hay necesidad de utilizar setFixedCHAR () para una instrucción INSERT. La base de datos siempre rellena automáticamente los datos a la anchura de la columna, ya que la inserta.

El siguiente ejemplo demuestra la diferencia entre el setString (), setCHAR () y setFixedCHAR () métodos.

// 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top