Ne peut pas utiliser une requête dans un JDBC PreparedStatement?
Le code de requête et la requête:
ps = conn.prepareStatement("select instance_id, ? from eam_measurement where resource_id in (select RESOURCE_ID from eam_res_grp_res_map where resource_group_id = ?) and DSN like '?' order by 2");
ps.setString(1,"SUBSTR(DSN,27,16)");
ps.setInt(2,defaultWasGroup);
ps.setString(3,"%Module=jvmRuntimeModule:freeMemory%");
rs = ps.executeQuery();
while (rs.next()) { bla blah blah blah ...
Retourne un vide ResultSet
.
De base de débogage, j'ai trouvé son la troisième lier qui est le problème, c'est à dire
DSN like '?'
J'ai essayé toutes sortes de variations, le plus sensible de ce qui semblait être l'aide d':
DSN like concat('%',?,'%')
mais qui ne fonctionne pas comme je suis absent de la '
sur chaque côté de la chaîne concaténée j'ai donc essayer:
DSN like ' concat('%',Module=P_STAG_JDBC01:poolSize,'%') ' order by 2
mais je n'arrive pas à trouver une façon de les obtenir dans qui travaille.
Ce qui me manque?
- L'écriture de code Java dans un fichier JSP plutôt que dans une vraie classe Java (où vous devrait l'ont fait) et à avoir des problèmes avec le particulier le code Java n'est pas une JSP problème. Vous serait exactement le même problème quand vous le faites dans une vraie classe Java. J'ai donc enlevé le
[jsp]
tag puisque c'est hors de propos. - Vrai, il n'est pas JSP spécifiques, mais alors il n'y a rien de mal à utiliser un tel code dans un servlet selon la plupart des livres que j'ai lus, surtout quand c'est un super rapport simple page de moins de 40 lignes de code où l'architecture de l'application est un peu exagéré 🙂 Mais j'apprécie votre point de vue!
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, le
PreparedStatement
des espaces réservés (ceux?
choses) sont pour valeurs de la colonne seulement, pas pour les noms de table, les noms de colonnes, des fonctions SQL/clauses, et cætera. Mieux utiliserString#format()
à la place. Deuxièmement, vous devriez pas citer les espaces réservés comme'?'
, il ne malform la requête finale. LePreparedStatement
setters déjà faire les citations (et de s'évader) le travail pour vous.Voici le fixe SQL:
Voici comment l'utiliser:
Voir aussi:
Il y a deux problèmes avec votre déclaration. Vous devez comprendre comment lier les variables de travail. La requête est ne sont pas traitées par substituing les personnages
?
avec vos paramètres. Au lieu de cela, la déclaration est compilé avec des espaces réservés et puis, lors de l'exécution, les valeurs réelles des paramètres sont données dans la bd.En d'autres termes, vous analysez la requête suivante:
Je suis sûr que le dernier paramètre sera ignoré, parce qu'il est dans un délimitée chaîne de caractères. Même si elle n'est pas ignoré, il ne fait pas de sens d'avoir
'
personnages autour parce que l'Oracle ne se lient pas un paramètre dans une chaîne de caractères (je suis surpris qu'il n'ait pas soulevé la moindre erreur, pouvez-vous attraper les exceptions ?).Maintenant, si vous remplacez votre
DNS LIKE '?'
avecDSN LIKE ?
et lier"%Module=jvmRuntimeModule:freeMemory%"
ce sens, et doit retourner les lignes correctes.Vous avez toujours le problème avec votre premier paramètre, il ne fera pas ce que vous attendez, i-e de la requête qui sera exécutée sera équivalent à la requête suivante:
qui n'est pas du tout le même que
Je suggère l'analyse (=prepareStatement) la requête suivante si vous pensez que le SUBSTR dynamique:
Si vous voulez utiliser COMME dans l'instruction préparée et qui veulent aussi utiliser le % de caractères COMME;
écrire une instruction préparée comme normalement " .... COMME ? ...." et, tout en affectant une valeur de paramètre à la question utilisation des marques de
ps.setString(1, "%" + "your string value" + "%");
Cela va fonctionner 🙂
Omettre le
'
autour de la?
. Sans le'
,?
est un espace réservé pour un paramètre. Avec elle, c'est une chaîne SQL (c'est à dire le même que"?"
en Java).Alors vous devez concaténer la chaîne sur le Java côté; vous ne pouvez pas passer SQL fonctions en tant que paramètres de requêtes; seules les valeurs de base (comme string, integer, etc) parce que le pilote JDBC convertir le paramètre le type SQL de la base de données attend et il ne peut pas exécuter des fonctions SQL dans cette étape.
Vous pouvez essayer:
Ici
var
est la variable dans laquelle la valeur qui est cherchée est stocké...Cela devrait fonctionner: