問題は、コミット全体でフェッチを実行しようとしていることです。
My_Data_Cur
を開いたとき for update
句では、OracleはMy_Data_1
のすべての行をロックする必要があります 行を返す前のテーブル。 commit
するとき 、Oracleはこれらすべてのロックを解放する必要があります(Oracleが作成するロックはトランザクションにまたがりません)。カーソルに要求したロックがなくなったため、for update
を満たすことができなくなったため、Oracleはカーソルを閉じる必要があります。 句。したがって、2番目のフェッチは0行を返す必要があります。
最も論理的なアプローチは、ほとんどの場合、commit
を削除することです。 1回のトランザクションですべてを実行します。本当に、本当に、本当に別々のトランザクションが必要な場合は、ループを繰り返すたびにカーソルを開いたり閉じたりする必要があります。ほとんどの場合、カーソルが開かれるたびに100行のみを返すように制限する何かをしたいと思うでしょう(つまり、rownum <= 100
条項)ロックを配置するためにすべての行にアクセスし、ループを通過するたびにロックを解放するために処理および削除した100以外のすべての行にアクセスする費用が発生しないようにします。