- PR -

DB2の特定のカラムに対し、PreparedStatementでLIKE検索が出来ない。

1
投稿者投稿内容
カレーうどん
会議室デビュー日: 2006/11/30
投稿数: 16
投稿日時: 2007-01-10 21:28
以前にDataBase Expartに書き込んでいたのですが、どうもPreparedStatementの使い方に近い質問だと思うので、こちらに書き込みしなおします。

Javaで、PreparedStatementを使用して、以下のようなSQL文を作成しました。
カラム名とテーブル名は仮の物です。

SELECT
TEST_COL
FROM
TEST_TABLE
WHERE
TEST_COL LIKE VARGRAPHIC(?)

DB2を使用しております。
TEST_COLはGRAPHIC型の列です。

パラメータをセットする際には、setStringメソッドを呼び出し、
"%TEST%"
というような文字列を入力しています。

このSQLを実行すると、SQLExceptionが発生し、以下のメッセージを取得できます。

"DB2 SQL error:SQLCODE: -418, SQLSTATE: 42610, SQLERRMC: null"

以上です。
Statementを使用するとちゃんと動きますし、コマンドエディタで実行しても動作します。
格納する値を変更しても同じでした。

このSQLはどこが間違っているのでしょうか?どうにかしてPreparedStatementを使用したいのですが、どなたか方法を教えて頂けないでしょうか。
未記人
ベテラン
会議室デビュー日: 2004/08/21
投稿数: 70
投稿日時: 2007-01-11 09:04
マニュアルは読んだんですか。
http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/core/rsql0400.htm

Googleは検索してみましたか。
http://www-1.ibm.com/support/docview.wss?uid=std3c3d15e2e67bb24c649256f1c0014799f
カレーうどん
会議室デビュー日: 2006/11/30
投稿数: 16
投稿日時: 2007-01-11 13:20
すみません、いくつか書き忘れていました。

> マニュアルは読んだんですか。

手元にマニュアルが無いので、テクニカルサポートを参考にしました。

以下のサイトを参考に、vargraphicでのキャストを行おうと考えました。
http://www-1.ibm.com/support/docview.wss?rs=608&q1=vargraphic&uid=std3fc36925629bff65849256f1f00236dfa&loc=ja_JP&cs=utf-8&cc=jp&lang=ja

> Googleは検索してみましたか

はい。キャストの方法などを参考にしました。
例えば、ご照会頂いたサイトを参考にして、vargraphic関数を使わないキャスト方法を用いて、以下のSQLも記述してみました。

SELECT
TEST_COL
FROM
TEST_TABLE
WHERE
TEST_COL LIKE cast('?' as VARGRAPHIC(40))

このSQLでPreparedStatementを生成し、setStringで値を格納して検索した所、例外は発生しませんでした。ただ、レコードは取得できません。
例えばsetString("%TEST%")と入れているのですが、"AAATESTBBB"というデータの入ったレコードが取得できません。
この現象については、エラーメッセージも無く、理由が全く解っていません。
以下のURLを見た限りでは、正しいように思えるのですが・・・。
http://www-06.ibm.com/jp/software/data/developer/library/techdoc/iiperformance.html

ご照会頂いたURLを元に考えると、後者のキャスト方法が正しいようにも思えるのですが、値が取得できない上にエラーメッセージが無いために原因が解りません。

大変申し訳ないのですが、どなたか原因を調べる方法だけでも教えて頂けないでしょうか。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2007-01-11 14:31
引用:

カレーうどんさんの書き込み (2007-01-11 13:20) より:
> Googleは検索してみましたか

はい。キャストの方法などを参考にしました。
例えば、ご照会頂いたサイトを参考にして、vargraphic関数を使わないキャスト方法を用いて、以下のSQLも記述してみました。

SELECT
TEST_COL
FROM
TEST_TABLE
WHERE
TEST_COL LIKE cast('?' as VARGRAPHIC(40))


いや、そのWebページで言っていることは、キャストの仕方を変える必要があるという
ことではなく、関数に渡す際に型を明示する必要がある、ということです。

つまり、

コード:
WHERE 
TEST_COL LIKE VARGRAPHIC(CAST(? AS VARCHAR(40))) 


のようにする必要があるということですね。
カレーうどん
会議室デビュー日: 2006/11/30
投稿数: 16
投稿日時: 2007-01-13 16:58
やっとできました!!
本当にありがとうございます。
よくマニュアルの意味を考えずに早とちりしてしまいました。

また解らない事があれば、よろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)