- - PR -
(ODP.NET)LIKE検索でバインド変数を使うとエラー
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-06-06 13:48
いつもお世話になっております。
VB2005、Oracle10g、ODP.NETで開発をしております。 件名のエラーに関してですが、以下のようなSQLを発行すると ORA-01489が発生 します ------------------------------------------------------------------------------ SELECT * FROM SYAIN_MST WHERE SYAINNAME LIKE :SYAINNAME || '%' ------------------------------------------------------------------------------ ORA-01489は「連結した文字列が長すぎる!」と怒っていると思うのですが、 怒られる理由が分かりません。現在、把握している事象は次の通りです。 ・バインド変数の値のバイト数がある一定のサイズと超えるとエラーが発生する。 ・その「一定のサイズ」というのはカラムのサイズより遥かに小さい。 ・その「一定のサイズ」はカラムのサイズによって変わってくる。 ・LIKE ではなく = に変えてやると、エラーは発生しない。 ・ObjectBrowserのようなツールで上記と同じバインド変数付きSQLを実行すると エラーは発生しない。 何かお心当たりのある方、疑わしき点がございましたらご教授願います。 宜しくお願い致します。 | ||||
|
投稿日時: 2007-06-06 13:55
NAL-6295です。
パラメタの値に%も含めてあげたらうまくいきませんか? | ||||
|
投稿日時: 2007-06-06 14:15
NAL-6295様
早速のご回答有難うございます。 お教え頂いたように、パラメタ自体に%を含めてやったらエラーは出ませんでした。 ただ、パラメタにはあくまで画面で入力された値のみを設定して、SQL組立ての ロジック内で%を付加するほうがフレキシブルに対処できるかと思っていたので ODP.NETにはちょっと残念な気持ちが・・・。 でも今回のシステムでは、%を付加する・付加しない を切り分けるような場面は ないので問題はないんですけれどもね。 なにはともあれ、この方法でいくことにします。 有難うございました。 | ||||
|
投稿日時: 2007-06-06 15:21
すいません解決策ではないです。
少し古いですが、こちらの環境 VisualStudio 2003 + odp.net 9.2.0.4(Oracle 10.2.0.1) では like :Parameter||'%' で問題なく検索が行われております。
一応回避策が出ているのでそちらで余計なことかもしれませんが。。。 一定のサイズで怒られるということですが、実際に怒られた時の SQL のサイズとパラメータのサイズは何バイトになっていますか? _________________ かるあ のメモ http://karua.at.webry.info/ [ メッセージ編集済み 編集者: かるあ 編集日時 2007-06-06 15:22 ] | ||||
|
投稿日時: 2007-06-06 15:32
NAL-6295です。
参考までに私の場合 入力値を、Likeを利用した時の特殊文字をエスケープした後に 前方一致 後方一致 等用途に合わせてパラメタのvalueに%を付加します。 パラメタの外に%を付加すると、前方一致か後方一致かで SQLが変化してしまいますので。 上記の処理は個々で実装するのではなく、ライブラリ側で吸収するようにしていますので、煩雑にはなりません。 [ メッセージ編集済み 編集者: NAL-6295 編集日時 2007-06-06 15:37 ] | ||||
|
投稿日時: 2007-06-06 16:15
かるあ様
>少し古いですが、こちらの環境 VisualStudio 2003 + odp.net 9.2.0.4(Oracle 10.2.0.1) では like :Parameter||'%' で問題なく検索が行われております。 あらら・・・。ODP.NETに不信感を持ったものの、ちゃんと動いているわけですね。 ちなみにカラムのサイズが40バイトのものに対しては12バイトまで、カラムのサイズ が80バイトのものに対しては30バイトまで、パラメータ指定が可能でした。これより 1バイトオーバーするとエラー発生です。 最新のものを使ってみたらうまくいくかもしれないですね。でも、それによって 開発環境自体がイカれてしまうのはこりごりなので、タイミングを見計らって チャレンジしてみたいと思います。有難うございました。 NAL-6295様 >等用途に合わせてパラメタのvalueに%を付加します。 これは Parameter.Value = [画面値] Parameter.Value = Parameter.Value & "%" としているということでしょうか? 私はとりあえず今は、Parameter.Value = [画面値] & "%" とやって おりますが、私の認識は合っておりますでしょうか? | ||||
|
投稿日時: 2007-06-06 16:23
ライブラリの中で value = 画面値の特殊文字をエスケープする(画面値) parameter.value = value & "%" としています。 |
1