Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Massenerfassung mit für Update

Das Problem ist, dass Sie versuchen, einen Abruf über einen Commit durchzuführen.

Wenn Sie My_Data_Cur öffnen mit dem for update -Klausel muss Oracle jede Zeile in My_Data_1 sperren Tabelle, bevor sie Zeilen zurückgeben kann. Wenn Sie commit , muss Oracle alle diese Sperren freigeben (die von Oracle erstellten Sperren erstrecken sich nicht über Transaktionen). Da der Cursor nicht mehr die angeforderten Sperren hat, muss Oracle den Cursor schließen, da es den for update nicht mehr erfüllen kann Klausel. Der zweite Abruf muss daher 0 Zeilen zurückgeben.

Der logischste Ansatz wäre fast immer, den commit zu entfernen und erledigen Sie das Ganze in einer einzigen Transaktion. Wenn Sie wirklich, wirklich, wirklich separate Transaktionen benötigen, müssten Sie den Cursor für jede Iteration der Schleife öffnen und schließen. Höchstwahrscheinlich möchten Sie etwas tun, um den Cursor so zu beschränken, dass er bei jedem Öffnen nur 100 Zeilen zurückgibt (d. h. eine rownum <= 100 Klausel), damit Sie nicht die Kosten tragen würden, jede Zeile zu besuchen, um die Sperre zu platzieren, und dann jede Zeile außer den 100, die Sie verarbeitet und gelöscht haben, um die Sperre jedes Mal durch die Schleife freizugeben.