- PR -

(ODP.NET)LIKE検索でバインド変数を使うとエラー

1
投稿者投稿内容
NVL
常連さん
会議室デビュー日: 2006/04/03
投稿数: 45
投稿日時: 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を実行すると
 エラーは発生しない。

何かお心当たりのある方、疑わしき点がございましたらご教授願います。
宜しくお願い致します。


NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2007-06-06 13:55
NAL-6295です。

パラメタの値に%も含めてあげたらうまくいきませんか?
NVL
常連さん
会議室デビュー日: 2006/04/03
投稿数: 45
投稿日時: 2007-06-06 14:15
NAL-6295様
早速のご回答有難うございます。

お教え頂いたように、パラメタ自体に%を含めてやったらエラーは出ませんでした。

ただ、パラメタにはあくまで画面で入力された値のみを設定して、SQL組立ての
ロジック内で%を付加するほうがフレキシブルに対処できるかと思っていたので
ODP.NETにはちょっと残念な気持ちが・・・。
でも今回のシステムでは、%を付加する・付加しない を切り分けるような場面は
ないので問題はないんですけれどもね。

なにはともあれ、この方法でいくことにします。
有難うございました。


かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-06-06 15:21
すいません解決策ではないです。
少し古いですが、こちらの環境 VisualStudio 2003 + odp.net 9.2.0.4(Oracle 10.2.0.1)
では like :Parameter||'%' で問題なく検索が行われております。

引用:

DreamTheaterさんの書き込み (2007-06-06 13:48) より:

ORA-01489は「連結した文字列が長すぎる!」と怒っていると思うのですが、
怒られる理由が分かりません。現在、把握している事象は次の通りです。

・バインド変数の値のバイト数がある一定のサイズと超えるとエラーが発生する。
・その「一定のサイズ」というのはカラムのサイズより遥かに小さい。
・その「一定のサイズ」はカラムのサイズによって変わってくる。
・LIKE ではなく = に変えてやると、エラーは発生しない。
・ObjectBrowserのようなツールで上記と同じバインド変数付きSQLを実行すると
 エラーは発生しない。


一応回避策が出ているのでそちらで余計なことかもしれませんが。。。
一定のサイズで怒られるということですが、実際に怒られた時の SQL のサイズとパラメータのサイズは何バイトになっていますか?

_________________
かるあ のメモ
http://karua.at.webry.info/

[ メッセージ編集済み 編集者: かるあ 編集日時 2007-06-06 15:22 ]
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2007-06-06 15:32
NAL-6295です。


引用:

DreamTheaterさんの書き込み (2007-06-06 14:15) より:
NAL-6295様

ただ、パラメタにはあくまで画面で入力された値のみを設定して、SQL組立ての
ロジック内で%を付加するほうがフレキシブルに対処できるかと思っていたので
ODP.NETにはちょっと残念な気持ちが・・・。



参考までに私の場合

入力値を、Likeを利用した時の特殊文字をエスケープした後に
前方一致
後方一致
等用途に合わせてパラメタのvalueに%を付加します。
パラメタの外に%を付加すると、前方一致か後方一致かで
SQLが変化してしまいますので。

上記の処理は個々で実装するのではなく、ライブラリ側で吸収するようにしていますので、煩雑にはなりません。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2007-06-06 15:37 ]
NVL
常連さん
会議室デビュー日: 2006/04/03
投稿数: 45
投稿日時: 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 = [画面値] & "%" とやって
おりますが、私の認識は合っておりますでしょうか?
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2007-06-06 16:23
引用:

DreamTheaterさんの書き込み (2007-06-06 16:15) より:
これは 
Parameter.Value = [画面値]
Parameter.Value = Parameter.Value & "%"
としているということでしょうか?

私はとりあえず今は、Parameter.Value = [画面値] & "%" とやって
おりますが、私の認識は合っておりますでしょうか?



ライブラリの中で

value = 画面値の特殊文字をエスケープする(画面値)
parameter.value = value & "%"

としています。
1

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