Expertise Java & J2EE

Astuces et conseils pour le programmeur raffiné

septembre 2010
lun. mar. mer. jeu. ven. sam. dim.
  12345
6789101112
13141516171819
20212223242526
27282930   
       
<  août sept. oct.  >
Google
 
À propos:

Conseils et opinions sur la programmation par un ingénieur Américain en France.

Me contacter


Voir aussi:

Mon blog personnel

GetJava Download Button

La clause IN dans un PreparedStatement [Permalink]

Thu Mar 20 22:20:03 CET 2008

Récemment un lecteur m'a posé la question suivante: «Je veux saisir un argument pour une clause IN dans une requête SQL. Mais je ne sais pas dans quel format il faut mettre la chaîne. J'ai essayé :

 public ResultSet executerSQL(String[] arg) {
    PreparedStatement ps = conn.prepareStatement(
        "SELECT * FROM TAB WHERE TAB.LIBELLE IN (?) ");
    ps.setArray(1, arg);
    ...

Mais ça ne marche pas! Qu'est-ce qu'il faut faire ? »

Ce qu'il faut comprendre, c'est que le "?" dans un PreparedStatement ne peut pas être employé pour remplacer n'importe laquelle chaîne plus tard. Chaque "?" doit correspondre à une donnée qui sera liée à un valeur avant de lancer la requête. (conn.prepareStatement() va compiler l'SQL fourni, alors le nombre d'arguments doit être fixe.)

Il en résulte qu'il est impossible d'avoir un nombre variable d'arguments pour un PreparedStatement une fois que celui-ci est créé. La seule solution est de générer le SQL dynamiquement. Imaginons que notre méthode reçoit en argument un String[] pour la clause IN. On peut donc écrire la requête de l'exemple précédent comme ça:

 public ResultSet executerSQL(String[] arg) {
    PreparedStatement ps = conn.prepareStatement(
        "SELECT * FROM TAB WHERE TAB.LIBELLE IN " + getInClause(arg.length));
    for (int i = 0; i < arg.length; i++)
        ps.setString(i + 1, arg[i]);
    ...
}

private String getInClause(int length) {
    StringBuffer sb = new StringBuffer("(");
    for (int i = 0; i < length; i++)
        sb.append(i + 1 == length ? "?)" : "?,");
    return sb.toString();
}

Certes, ce n'est pas aussi beau que ça n'aurait été si on pouvait utiliser setArray(), mais c'est la seule façon qui est permise.

   Trackbacks [0]

Powered By blojsom
XML  RSS  RDF