2012-02-13 8 views
0

PL/SQLでネストされた、または内部の明示カーソルを使用することが現実的であるのは不思議でした。 JOINSを使用して状況を常に回避できますか?
実用的な方法で使用されているインナーカーソルの例は素晴らしいでしょう! ありがとうございます。あなたはネストされたインナー・カーソルPL/SQL

FOR outer IN (<<query A>>) 
LOOP 
    FOR inner IN (<<query B that depends on data from the outer query>>) 
    LOOP 
    <<do something>> 
    END LOOP; 
END LOOP; 

のような構造の話をしている場合、それは基本的に(つまり、オプティマイザが悪い計画をピックアップし、それがいることを、他の方法を修正することは現実的ではありませんいくつかのコーナーケースを除けば)します

答えて

4

は常により効率的に2つのクエリを結合して結合を行います。 SQLエンジンは、2つのテーブル(または2つのクエリ)を結合する方法をはるかに柔軟に把握することができ、PL/SQLエンジンで作成するコードよりもはるかに優れています。

これは、少量のデータを処理している場合(システムをメンテナンスしている他の開発者)は、組み合わせたクエリの後に問題がある場合、保守性の観点からコードループこのような。他の言語から来ている開発者が読書をより快適にするようなアプローチである可能性が高いです。データボリュームが小さい場合、ネストされたループ結合を手動でコーディングする追加のオーバーヘッドは、一般的に比較的小さくなり、許容可能なコードを生成できます。

個人的には、可能であればこの種の構造を避けようとしていますが、大量のデータを処理するシステムや、適切なPL/SQLと適切なSQLを書くのが快適な人たちと作業する傾向があります。ジョインによるクエリはより読みやすくなります。一方、小さなテーブルの一回限りの更新を行っている場合は、この種のループを実行するクイックブロックを作成する方が早く簡単になるかもしれません。 2つの大きなクエリを結合しても予期しないことが起こらないことを確認してください。