Pergunta

Eu tenho tentado descobrir por que o código a seguir não está gerando nenhum dado no meu ResultSet:

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

Por outro lado, as seguintes funcionam corretamente:

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

O tipo de dados para a escola é char (9 byte). Em vez de definir, eu também tentei:

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();

Estou completamente preso ao que investigar a seguir; O Debugger do Eclipse diz que a consulta SQL não muda mesmo após o SetString ou o SetCharacterStream. Não tenho certeza se é porque a configuração de parâmetros não está funcionando, ou se o depurador simplesmente não consegue obter alterações no estatuto preparado.

Qualquer ajuda será muito apreciada, obrigado!

Foi útil?

Solução

Eu acho que o problema é que seu tipo de dados é char (9) e "waterloo" tem apenas 8 chars. Suponho que isso retornaria os resultados esperados (como e %). Ou adicione o espaço ausente.

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 de usar Varchar em vez de char se suas strings tivessem um comprimento flexível. Então o estatuto preparado 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 Javadoc da Oracle da Oracle: Javadoc:


Os dados de char no banco de dados são acolchoados para a largura da coluna. Isso leva a uma limitação no uso do método setChar () para vincular os dados do caractere na cláusula WHERE de uma instrução SELECT-os dados do caractere na cláusula onde também devem ser preenchidos para a largura da coluna para produzir uma correspondência na instrução SELECT. Isso é especialmente problemático se você não conhece a largura da coluna.

setfixedchar () remedia isso. Este método executa uma comparação não acolchoada.

Notas:

  • Lembre -se de lançar seu objeto de declaração preparado ao OraclePreparedStatement para usar o método setFixedchar ().
  • Não há necessidade de usar setFixedchar () para uma instrução Insert. O banco de dados sempre atinge automaticamente os dados para a largura da coluna, pois o 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top