Domanda

Ho cercato di capire perché il seguente codice non genera alcun dato nei miei ResultSet:

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

D'altra parte, i seguenti eseguito correttamente:

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

Il tipo di dati per la scuola è CHAR (9 byte). Invece di setString, ho anche provato:

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

Sono completamente bloccato su cosa indagare successivo; il debugger Eclipse dice la query SQL non cambia anche dopo setString o setCharacterStream. Non sono sicuro se è perché l'impostazione dei parametri non funziona, o se il debugger semplicemente non può prendere cambiamenti nel PreparedStatement.

Ogni aiuto sarà molto apprezzato, grazie!

È stato utile?

Soluzione

Credo che il problema è che il tipo di dati è CHAR (9) e "Waterloo" ha solo 8 caratteri. Suppongo che questo sarebbe restituire i risultati attesi (come 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 per un uso varchar invece di char se le corde hanno una lunghezza flessibile. Poi il PreparedStatement avrebbe funzionato come previsto.

Una soluzione potrebbe essere quella di utilizzare il metodo specifico setFixedCHAR Oracle (ma è meglio cambiare il tipo di dati di varchar se possibile).

Di seguito è da PreparedStatement JavaDoc di Oracle:


CHAR dati nel database è imbottita per la larghezza della colonna. Questo porta ad una limitazione nel utilizzando il metodo setCHAR () per i dati di carattere legano nella clausola WHERE di un'istruzione SELECT - i dati di caratteri nella clausola WHERE deve essere imbottito per la larghezza della colonna per produrre una corrispondenza nell'istruzione SELECT. Ciò è particolarmente problematico se non si conosce la larghezza della colonna.

setFixedCHAR () rimedi questo. Questo metodo esegue un confronto non imbottito.

Note:

  • Ricordate di lanciare l'oggetto istruzione preparata per OraclePreparedStatement utilizzare il metodo setFixedCHAR ().
  • Non v'è alcuna necessità di utilizzare setFixedCHAR () per un'istruzione INSERT. La banca dati sempre pads automaticamente i dati per la larghezza della colonna come si inserisce.

L'esempio seguente mostra la differenza tra il setString (), setCHAR () e setFixedCHAR () metodi.

// 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top