Concepts GuideのData 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
句を使用することができます実行中の照会で使用された行は、照会がコミットまたはロールバックを終了するまでブロックされます。
時には唯一の方法であるカーソルは、常に非効率的です。フォワードのみの読み取りから完全に同期するまで、いくつかの種類のカーソルがありますが、より多くのコストがかかるほど必要になります。できるだけ最適なカーソルを作成するよりも、カーソルを必要としないようにすること(管理タスク以外のものを除く)には常に努力する方が良いです。 –
@TonyHopkinson - カーソルを使用せずにリレーショナルデータベースのデータにアクセスする方法を教えてください。 –
Selectステートメント...カーソルを使って何をしているのかによって異なりますが、スキーマの変更によって多くの問題に対処することができますが、これは必ずしもオプションではありません。 –