1

コードからの抜粋

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

上記のコードは正常に実行されます。

しかし、私がこれを実行しようとすると

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

例外がスローされます。"準備する文字列にパラメータマーカーの無効な使用が含まれています"

ここで何が問題になる可能性がありますか?


回答が見つかりました。コメントをご覧ください

4

3 に答える 3

4

問題は、関数をパラメーターに直接適用できないことだと思います。コードではなくデータベースで下部ケーシングを実行する必要がある特別な理由はありますか?(確かに、いくつかの潜在的な理由を考えることができます。)本当にこれを行う必要がない限り、SQLを次のように変更します。

SELECT * FROM sch.tab1 where col1 like ?

Javaで呼び出しtoLower()ます。できれば、小文字を実行する適切なロケールを指定します。

于 2009-06-23T10:32:46.847 に答える
3

カルロスは何かに取り組んでいると思います。試す

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

または、ご使用のバージョンのSQLで文字列連結演算子に渡されるものは何でも。文字列コンテキストを強制すると、エラーが発生する可能性があります。追加の括弧が必要になる場合があります。

于 2009-06-23T16:59:24.017 に答える
0

NORMALIZE_STRING参考:関数を使用しているときに同じ問題が発生しました:

SELECT NORMALIZE_STRING(?, NFKD) FROM sysibm.sysdummy1

エラーメッセージ:

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

次のステートメントを使用すると、問題が解決しました(CONCAT)。ポール・チャーノックに感謝します!

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

Unicode互換性のために「G」プレフィックスに注意してください。

于 2013-10-21T10:51:18.363 に答える