プロが教えるわが家の防犯対策術!

PL/SQLを使い始めた初心者です。
Oracleのバージョンは9iです。
検索時の条件の設定について教えてください。

例えば、2つテーブルがあるとします。

Aテーブル.TESTNoA
-------------
11111
22222
33333
44444
55555

Bテーブル.TESTNoB
-------------
11111
33333
55555

SQL発行時、

WHERE A.TESTNoA = B.TESTNoB

で3件のレコードが取得できますよね。
これと同じ結果が欲しいのですが、
検索条件にテーブル型の変数(索引付表?)は使用できるのでしょうか?

変数 TestHen(0) = 11111
TestHen(1) = 33333
TestHen(2) = 55555

こんな感じで設定しておいて、この変数を利用して
一度のSQLで結果を取得したいのです。
できればLIKEを使って検索したいのですが…。

書き方がおかしかったらすみません。
どなたかお知恵をお貸しください。

A 回答 (3件)

一度のSQLで取得するのは無理だと思います。


といいますのも
where A.TESTNoA = TestHen(TestHen変数はテーブル型変数)
などと一つのものとテーブル型の変数を=では比較できないからです。
で、どうするかというとテーブル型変数はNo1さんの回答のとおり作成できるのでそこに入っているものをカーソルを用いて中間テーブルに格納し
質問で記述しているwhere句のような形でテーブルとテーブルを結合する形で行を抽出します。
WHERE A.TESTNoA = any ( select b.testNoB from Dummy);

ちなみにLIKEを使って検索したいということですが
抽出したい行のデータとテーブル型変数に入っているデータは完全一致しないデータということでしょうか。
そうであればちょっと上のような例では難しいので
1SQLでは無理ではないでしょうか。
カーソルを使って一つ一つ比較していくしか無いと思います。

この回答への補足

ご回答ありがとうございます。
LIKEを使いたいというのはおっしゃるとおり、完全に一致しないデータがある可能性があるのです。また、抽出結果を別の条件でソートしなければならないため、1回のSQLでなんとかならないかと思ったのですが…。
検討してみます。ありがとうございました。

補足日時:2006/04/01 01:02
    • good
    • 0

#2です。


よくプログラマーの方がすごい何十ステップにもおよぶ
1SQL文を書いているのを目にします。
大量データ、性能試験をやって問題なく
動作するのを確認してくれればいいのですが
少量のデータで試験をして正しい回答が出たからこれでOK!
みたいなことをやられると後工程でそのSQLが本番の大量試験になると
1時間経っても返って来ないということがよくあります。
一概には言えませんが
PL/SQLのPL/SQL表やホスト変数としていったん退避して
そのテーブル型変数を用いて単純なSQLをLOOPで繰り返す方が
ずっと早い場合もあります。
(バインド変数などを使うとOracleは実行計画を
再利用してくれたりもするのでさらに高速化します)
プログラムを書く人はできるだけプログラムを単純化、見やすいようにしようと
努力しているようですがその結果処理速度が遅いプログラムになってしまっては
本末転倒です。
あまり「1SQLで!」というのにこだわらず
トータルの処理速度が速い処理内容が一番いいですよ。

この回答への補足

御礼が遅くなり、申し訳ありませんでした。結局、1SQLでは無理かもと仰っていただきましたので、それは諦めました。バインド変数や動的SQLを使ってコーディングしようかと思っています(まだやってないんですけど…)。
ありがとうございました。

補足日時:2006/04/05 22:59
    • good
    • 0

TYPE T_VAR IS TABLE OF Aテーブル.TESTNoA%type INDEX BY BINARY_INTEGER;


これでいけないかい?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!