2012-04-10 2 views
2

私は現時点でカーソルで作業していますが、それは私のために乱雑になっています。カーソルの作成、データはコピーされていますか?

私はカーソルについては、Oracleのマニュアルを確認しているが、私は見つけることができません。

カーソルが開かれている場合は、メモリ上に作成された結果のローカルコピーですか?

  • はい:大量のデータを含むテーブルがあると本当に意味がありますか?私はそれが本当に効率的ではないと思いますよね?
  • いいえ: データ全体が他のプロセスにロックされていますか?私は、各行のための本当に重いプロセスをやっている場合、データはそう長くのためにunavaliableだろう...何

  • NO :

    1. YES 別のプロセスが変更した場合、何が起こりますか私が現在カーソルで使用しているデータ、または新しい行が追加された場合は、カーソルのために更新されますか?

本当にありがとうございました。

+0

時には唯一の方法であるカーソルは、常に非効率的です。フォワードのみの読み取りから完全に同期するまで、いくつかの種類のカーソルがありますが、より多くのコストがかかるほど必要になります。できるだけ最適なカーソルを作成するよりも、カーソルを必要としないようにすること(管理タスク以外のものを除く)には常に努力する方が良いです。 –

+0

@TonyHopkinson - カーソルを使用せずにリレーショナルデータベースのデータにアクセスする方法を教えてください。 –

+0

Selectステートメント...カーソルを使って何をしているのかによって異なりますが、スキーマの変更によって多くの問題に対処することができますが、これは必ずしもオプションではありません。 –

答えて

3

Concepts GuideData Concurrency and Consistencyセクションをお読みください。

あなたの特定の質問に対する回答:

カーソルが開かれている場合は、 メモリ上に作成された結果のローカルコピーですか?

ありません、しかし、Oracleの「マルチバージョン読取り一貫性」(上記のリンクを参照)を介して、カーソルによってフェッチされた行は、すべてのカーソルがオープンされた時点と一致するだろう - フェッチがなるとき各行、すなわちカーソルが開かれたときに存在し、同じ値を持っている行(たとえ別のセッションがその間に更新または削除したとしても)。

いいえ:データ全体が他のプロセスにロックされていますか?

NO:別のプロセスが、私は現在のカーソルまたはそれは新しい行を追加する場合は使用していたデータを修正する場合に何が起こるか、それはカーソルのために更新されるのでしょうか?

カーソルには変更が表示されず、カーソルを開いたときに存在していた行が引き続き使用されます。

コンセプトガイドはこれを詳細に説明するが、以下のように、それが動作する方法の本質は次のとおりです。

  • Oracleは継続的に増加されSystem Change Number (SCN)と呼ばれるものを維持しています。
  • カーソルが開くと、SCNの現在の値が表示されます。
  • カーソルが行をフェッチするとき、カーソルはそれらにスタンプされたSCNを調べます。このSCNがカーソルの開始SCNと同じかそれより低い場合、データは最新であり、使用されます。しかし、行のSCNがカーソルのそれより高い場合、これは別のセッションが行を変更したことを意味し、変更をコミットしました。この場合、Oracleは古いバージョンの行のロールバック・セグメントを検索し、代わりにその行を使用します。クエリが長時間実行されると、古いバージョンがロールバック・セグメントで上書きされている可能性があります。この場合、問合せはORA-01555エラーで失敗します。

必要に応じてこのデフォルトの動作を変更できます。今

CURSOR c IS SELECT sal FROM emp FOR UPDATE OF sal; 

変更しようとする任意のセッション:たとえば、それは他のセッションは、あなたのカーソルの実行中に照会されている行を変更しないことが重要である場合は、行をロックするFOR UPDATE句を使用することができます実行中の照会で使用された行は、照会がコミットまたはロールバックを終了するまでブロックされます。

関連する問題