Взаимодействие блокировки SELECT FOR UPDATE с курсором и пакетным DML - PullRequest
0 голосов
/ 30 мая 2018

В настоящее время мой кодовый скелет выглядит следующим образом:

varchar rowidvariable[batchlimitcount][19];

stmt = "Select rowid from table_name where xx"
delstmt = "delete from table_name where rowid=:rowidvariable"
prepare delstatement using delstmt;

prepare cursor from stmt;
declare cursor from preparecursor;
open cursor;

while(1)
{
    fetch cursor into rowidvariable;

    somecondition {break};        

    exec sql for fetchedCount 
        execute delstatement using :rowidvariable;

    commit;

} 

Мне было указано, что блокировка таблицы с помощью SELECT FOR UPADATE будет способом обеспечить 100% блокировку строк и ROWID в любом случае (как бы мало это ни было) не меняется.

Однако, поскольку commit; снимает блокировку, и крайне важно, чтобы я удалял ее партиями, поскольку существуют миллионы записей, кажется,быть сложным в продвижении с предложенным решением.

Пожалуйста, сообщите, если есть какие-либо лучшие альтернативы.Заранее спасибо.

Ответ на предыдущий вопрос: Ссылка

Обратите внимание, что весь процесс происходит в oracle-pro-c .

1 Ответ

0 голосов
/ 30 мая 2018

звучит так, как будто проблема заключается в том, что вам нужно удалить миллионы строк, и поэтому вы хотите сделать это в пакетах

, если это так, это может сработать для вас - он будет проходить и удалять строки и фиксироватьчтобы вам не хватило отмены и вам не нужно беспокоиться о блокировке строк

begin
   loop
      delete from xx where yyy=zzz and rownum < 1000;
      exit when sql%rowcount = 0;
      commit;
   end loop;
   commit;
end;
/
...