Oracle
 sql >> Base de données >  >> RDS >> Oracle

Requête Oracle SQL paramétrée en Java ?

Je pense que le problème est que votre type de données est CHAR(9) et "Waterloo" n'a que 8 caractères. Je suppose que cela renverrait les résultats attendus (LIKE et %). Ou ajoutez l'espace manquant.

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

La meilleure façon serait d'utiliser varchar au lieu de char si vos chaînes ont une longueur flexible. Ensuite, le PreparedStatement fonctionnerait comme prévu.

Une solution de contournement consisterait à utiliser la méthode setFixedCHAR spécifique à Oracle (mais il est préférable de changer le type de données en varchar si possible).

Ce qui suit provient du JavaDoc PreparedStatement d'Oracle :

Les données CHAR dans la base de données sont complétées à la largeur de la colonne. Cela conduit à une limitation de l'utilisation de la méthode setCHAR() pour lier les données de caractères dans la clause WHERE d'une instruction SELECT -- les données de caractères dans la clause WHERE doivent également être complétées à la largeur de la colonne pour produire une correspondance dans l'instruction SELECT. Ceci est particulièrement gênant si vous ne connaissez pas la largeur de la colonne.

setFixedCHAR() remédie à cela. Cette méthode exécute une comparaison non rembourrée.

Remarques :

  • N'oubliez pas de convertir votre objet d'instruction préparé en OraclePreparedStatement pour utiliser la méthode setFixedCHAR().
  • Il n'est pas nécessaire d'utiliser setFixedCHAR() pour une instruction INSERT. La base de données remplit toujours automatiquement les données à la largeur de la colonne lorsqu'elle les insère.

L'exemple suivant illustre la différence entre les méthodes setString(), setCHAR() et 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