2009-06-23 5 views
1

Extrait du CodeQuery ne fonctionne pas avec un marqueur de paramètre avec PreparedStatement

PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM sch.tab1 where col1 like lower ('ABZ') "); 
preparedStatement.executeQuery(); 

Le code ci-dessus exécute avec succès.

Mais lorsque je tente d'exécuter cette

PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM sch.tab1 where col1 like lower (?) "); 
preparedStatement.setString (myValue); 
preparedStatement.executeQuery(); 

Il lance une exception. « STRING À CONTIENT PREPARE UTILISATION TORT PARAMETER MARQUEURS »

Quel pourrait être le problème ici?


Réponse trouvée, voir les commentaires

+0

Cela dépend potentiellement du pilote jdbc. Quelle est votre base de données? – skaffman

+1

Compte tenu des tags, je suppose db2. –

+0

@skaffman, j'utilise DB2 –

Répondre

3

Je pense que Carlos est sur quelque chose. Essayez

SELECT * FROM sch.tab1 where col1 like lower ('' + ?) 

ou tout ce qui est passé pour l'opérateur de concaténation de chaînes dans votre version de SQL. Forcer un contexte de chaîne peut vous permettre de dépasser l'erreur. Peut nécessiter des parenthèses supplémentaires.

+0

** '' +? **, je n'ai jamais su que vous pouvez utiliser l'opérateur + pour la chaîne en SQL.atleast dans DB2 vous ne pouvez pas utiliser. –

+1

Accepter comme SELECT * FROM sch.tab1 où col1 like lower ('' ||?) 'Fonctionnera –

4

Je suspect le problème est que vous ne pouvez pas appliquer des fonctions directement aux paramètres. Y a-t-il une raison particulière pour laquelle vous voulez que le boîtier inférieur soit exécuté dans la base de données plutôt que dans votre code? (Je peux penser à quelques raisons possibles, il est vrai). À moins que vous avez vraiment besoin de faire cela, je venais de changer le SQL:

SELECT * FROM sch.tab1 where col1 like ? 

et appelle toLower() en Java, en spécifiant les paramètres régionaux de préférence approprié pour effectuer le boîtier inférieur.

+0

Actuellement, je fais "preparedStatement.setString (1, myValue.toLower());" comme un travail autour, mais pourquoi il n'est pas possible de faire en utilisant des marqueurs? –

+0

Je ne sais pas - ce pourrait être une restriction DB2, ou peut-être une dans leur pilote JDBC. Une alternative serait de créer un proc stocké qui a fait le boîtier inférieur pour vous ... –

+1

peut-être parce que le pilote ne serait pas en mesure de déterminer le type de données correct pour l'argument ... –

0

Pour référence: Je suis tombé sur le même problème en utilisant la fonction NORMALIZE_STRING:

SELECT NORMALIZE_STRING(?, NFKD) FROM sysibm.sysdummy1 

Message d'erreur:

THE DATA TYPE, LENGTH, OR VALUE OF ARGUMENT 1 OF NORMALIZE_STRING IS INVALID. SQLCODE=-171, SQLSTATE=42815, DRIVER=4.13.111 

utilisant l'instruction suivante a résolu le problème (CONCAT). Merci à Paul Chernoch!

SELECT search_normalize(NORMALIZE_STRING(? CONCAT G'', NFKD)) FROM sysibm.sysdummy1 

Notez le préfixe "G" pour la compatibilité Unicode.