は、私のようなものを持っていると仮定しますかクエリSELECT * FROM foo
はFOR row IN foo_cur
行で実行されていますか?カーソル内のクエリはいつ実行されますか?私はカーソルをオープンする前に、私は<code>foo</code>から行を削除した場合、これらの行は、まだカーソル結果の一部となる</p> <pre><code>CURSOR foo_cur IS SELECT * FROM foo; ... DELETE FROM foo WHERE bar=1; FOR row IN foo_cur LOOP ... END LOOP; </code></pre> <p>:?
6
A
答えて
12
カーソルから返される一連の行は、カーソルが(OPEN
明示的にまたはFOR
ループによって)開かれた時点で決定されます。この場合、削除した行はループに戻されません。
通常、クエリは一度に実行されません。 Oracleは問合せを実行して次の行セットをフェッチし、PL/SQL VMに戻します。 11gでは、一度に100行の暗黙のBULK COLLECT
を実行します。したがって、戻される行がなくなるまで、ループの100回の繰り返しごとに問合せが実行されます。複数バージョンの読取り一貫性のため、Oracleは、コードの実行中に他のセッションが変更を加えてコミットしていても、カーソルがオープンされたときに存在していたデータを常に返します。
私が探していたちょっとした説明です。ありがとう! – DiscoInfiltrator