- PR -

パラメータの多いストアドプロシージャ(oracle)

投稿者投稿内容
パンダ++
会議室デビュー日: 2005/12/10
投稿数: 8
投稿日時: 2005-12-10 00:46
oracle9iのデータベースに対して検索をかけることになりました。
ストアドプロシージャを使うべきか、SQLコマンド文を生成するべきか
迷っていまして、こちらで相談させていただきました。よろしくお願いします。

以下のようにwindowsアプリから複数の条件を指定して検索を実行します。

【レコード】
・・・|出身地|出身大学|選考|スポーツ|・・・

【検索条件】
出身地=愛知県 AND
出身大学=●●大学 AND
選考=経済学 AND
スポーツ=フットサル

検索条件は最低1つで最大4つを指定することができます。
指定しなかった検索条件は、すべてのものを返すようにします。

- - - - - - - - - - - - - - - - - - - - - - - - - - - -

ストアドプロシージャを利用するということになった場合、
例えば検索条件を2つだけ指定するケースでは
 @出身地=愛知県
 @出身大学=●●大学
 @選考=* AND
 @スポーツ=*
のようにワイルドカードを使うという方法を考えています。
対してストアドを使わないと言うことになれば、
 SELECT なんたら FROM なんたら WHERE
  出身地=愛知県
  出身大学=●●大学
という文字列を毎度生成することになるかと思います。

検索パフォーマンスを重視するのであれば、
ストアドを使用する/しないのどちらがよいのでしょうか。
また、上の例では検索パラメータが4つでしたが、
これが10個や20個となった場合はどちらがよいのでしょうか。



[ メッセージ編集済み 編集者: パンダ++ 編集日時 2005-12-10 00:50 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-10 01:19
引用:

パンダ++さんの書き込み (2005-12-10 00:46) より:

ワイルドカードを使うという方法を考えています。


何故でしょうか?
指定がないのであれば条件自体に含まなければ良いと思いますが、
私が読み違えているのでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
パンダ++
会議室デビュー日: 2005/12/10
投稿数: 8
投稿日時: 2005-12-10 01:47
夜遅くにお返事ありがとうございます。

私がストアドのことをよく理解できていないため
この文章もずれてるかもしれませんがご容赦ください。

まず、最大4つ、最低1つの条件を指定するストアドは

SELECT なんとか FROM なんとか WHERE
 出身地=@country AND
 出身大学=@univ AND
 専攻=@study AND
 スポーツ=@sports
で実現できるというところまでは正しいでしょうか?

ここで出身地と専攻だけ指定して、大学とスポーツはとりわけ指定しない場合は
(人によってはスポーツだけ指定したい、大学と専攻を選択したいと色々あるとして)
@country=愛知
@univ=*
@study=法律
@sports=*
というところは
@country=愛知
@study=法律
だけ指定して呼べば大丈夫なのでしょうか?

VB.NETのWindowsアプリケーションから呼ぶことを考えた場合は
SqlParameter(なんたら)=なんたら
というように指定すると思うのですが、これを必要な2つだけ
指定してやればよいということでしょうか?

4つの条件から何を選ぶかの組み合わせは12通りありますが、
ワイルドカードを使うなり、選択肢をNullで渡すなりすることで
その選択肢が無視されるのであれば1本のストアドで事足りるのかな?と
思ったのがこの質問の始まりです。
そういう使い方ができなければCommand文を生成する方法が一番でしょうか?

[ メッセージ編集済み 編集者: パンダ++ 編集日時 2005-12-10 01:51 ]
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-12-11 07:41
引用:

パンダ++さんの書き込み (2005-12-10 01:47) より:
まず、最大4つ、最低1つの条件を指定するストアドは

SELECT なんとか FROM なんとか WHERE
 出身地=@country AND
 出身大学=@univ AND
 専攻=@study AND
 スポーツ=@sports
で実現できるというところまでは正しいでしょうか?


それって普通はストアドって言わない。静的SQLって呼びますよね。

引用:

4つの条件から何を選ぶかの組み合わせは12通りありますが、
ワイルドカードを使うなり、選択肢をNullで渡すなりすることで
その選択肢が無視されるのであれば1本のストアドで事足りるのかな?と
思ったのがこの質問の始まりです。
そういう使い方ができなければCommand文を生成する方法が一番でしょうか?


ワイルドカードによる文字列比較では、NULLは検出対象になりませんよね(たしか・・・)?これはすなわち、検索条件を指定していない場合と同じ処理にはならないと言う事です。

動的SQLで指定する場合と、ワイルドカードで指定する場合のどちらがパフォーマンスに優れているのかは、単純には判断できません。ご自分で検証用のプログラムを書いて、計測するのが一番でしょう。
パンダ++
会議室デビュー日: 2005/12/10
投稿数: 8
投稿日時: 2005-12-13 00:30
甕星様、ご回答ありがとうございます。

恥ずかしながら、使い回しできるタイプのSQLはすべて
ストアドプロシージャなのかと思っていました。
いまさらですが色々とサイトを見て回って勉強し直しました。

検索対象となるテーブルにはNULL値が入ってこないことが
保障されていますので、パラメータにワイルドカードを指定した場合と、
必要な条件だけを指定したコマンド文を使用した場合とで
同じ検索結果が返るのではないか、と思います。

例では4つの条件といったのですが実際の開発では
1つのテーブルを、最大14個の条件で検索することが決まっています。
すべての条件はお互いに関係なく、それぞれをANDでつないで検索します。
OR条件や、ある条件を指定すると他の条件は使用できない、というものはありません。
対象データの性質は営業のナレッジ関連のもので、
登録日、訪問日、訪問顧客名、登録者、登録区分・・・
というような項目を検索対象とします。

検索条件が多いのでパラメータを使って呼ぶほうがすっきりしそうですので、
パラメータを使おうかなと思い立ったんですけれども、
 1.パラメータとワイルドカードを使って検索する
 2.コーディング内でコマンド文を生成して検索する
の2つの方法以外に何か良い方法はありますでしょうか?

1つ条件を指定するたびに検索を実行して順次絞り込んでいくという
方法も検討したのですが、トランザクションが増えすぎる恐れがあるので
現在検討中の手段を優先的に検討していきたいと考えています。

現在、データベース構築の最中ですのでまだ検証を行うことができませんが、
作業が終わりましたらばとりあえずこの2つの方法を比較して
結果をこちらに報告できれば、と考えております。
宣伝中止!
大ベテラン
会議室デビュー日: 2005/08/30
投稿数: 155
お住まい・勤務地: 東京に作業場所変更・・・
投稿日時: 2005-12-13 09:00
DBMS_SQLパッケージ使って実現するという選択肢は無し・・・?
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2005-12-13 09:44
>検索対象となるテーブルにはNULL値が入ってこないことが
>保障されていますので

でしたら、こんな方法もありますね
http://arton.no-ip.info/collabo/backyard/?PreparedStatementAndNull
http://oraclesqlpuzzle.hp.infoseek.co.jp/8-2.html
パンダ++
会議室デビュー日: 2005/12/10
投稿数: 8
投稿日時: 2005-12-13 23:46
宣伝中止!様、ご回答ありがとうございます。
明智重蔵様、ご回答ありがとうございます。

select なんとか from なんとか
where
(
Foo = ?
and Bar = ?
)
is not false

という方法はOracleではエラーになりました。

select なんとか from なんとか
where case when not
(
Foo = ?
and Bar = ?
)
then 1 else 0 end =0

という方法は前述の2案に合わせて検討させていただきたいと思います。


DBMS_SQLパッケージというとDDLで使うものというイメージだったのですが、
今回のようなケースでも効果的に使うことができそうです。

SQL文をVBのコード上でつなげていく方が手馴れているし
わかりやすいのですが、今回はちょっと時間的に余裕もありますので
DBMS_SQLで簡単なコードを練習して使い勝手を検証してみようかと思います。


[ メッセージ編集済み 編集者: パンダ++ 編集日時 2005-12-13 23:47 ]

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