bulk collect mit "for update"

Lauf ich in ein Interessantes und unerwartetes Problem bei der Verarbeitung der Datensätze in Oracle (11g) mit der BULK COLLECT.

Den folgenden code lief Super, die Verarbeitung über alle Millionen plus Aufzeichnungen mit sich ein Problem:

-- Define cursor
cursor My_Data_Cur Is
Select col1
      ,col2
from My_Table_1;


-- Open the cursor
open My_Data_Cur;

-- Loop through all the records in the cursor
loop

  -- Read the first group of records
  fetch My_Data_Cur
  bulk collect into My_Data_Rec
  limit 100;

  -- Exit when there are no more records to process
  Exit when My_Data_Rec.count = 0;

  -- Loop through the records in the group
  for idx in 1 .. My_Data_Rec.count
  loop
     do work here to populate a records to be inserted into My_Table_2 
  end loop;

  -- Insert the records into the second table
  forall idx in 1 .. My_Data_Rec.count
  insert into My_Table_2…;

  -- Delete the records just processed from the source table
  forall idx in 1 .. My_Data_Rec.count
  delete from My_Table_1 …;

  commit;
end loop;

Da am Ende der Verarbeitung jeder Gruppe von 100 Datensätzen (limit 100) wir löschen die Datensätze nur gelesen und verarbeitet, ich dachte, es wäre eine gute Idee, fügen Sie die "for update" - syntax, um die cursor-definition so, dass ein anderer Prozess konnte nicht aktualisieren von Datensätzen, zwischen der Zeit, die Daten zu Lesen und die Zeit, die der Datensatz gelöscht wird.

So, das einzige, was in dem code den ich geändert habe war...

cursor My_Data_Cur
is
  select col1
        ,col2
from My_Table_1
for update;

Bei mir lief der PL/SQL-Paket auch nach dieser änderung, der job verarbeitet nur 100 Datensätze aus und beendet sich dann. Ich bestätigte diese änderung verursacht wurde das Problem durch das entfernen der "for update" aus dem cursor und wieder einmal ist das Paket verarbeitet, alle Datensätze aus der Quelltabelle.

Irgendwelche Ideen, warum das hinzufügen der "for update" - Klausel würde dazu führen, diese änderung im Verhalten? Irgendwelche Vorschläge auf, wie man dieses Problem umgehen? Ich werde versuchen, ab einer exklusiven Transaktion auf die Tabelle am Anfang des Prozesses, aber dies ist nicht eine Idee, Lösung, weil ich wirklich nicht wollen, um die gesamte Tabelle sperren, die die Verarbeitung der Daten.

Vielen Dank im Voraus für Eure Hilfe,

Gewähren

InformationsquelleAutor Grant | 2014-02-07

Schreibe einen Kommentar