количество строк, затронутых откатом - PullRequest
3 голосов
/ 21 мая 2010

Мне нужно узнать количество строк, затронутых откатом. Как я могу получить это? Пожалуйста, помогите.

Ответы [ 4 ]

6 голосов
/ 21 мая 2010

Рассмотрим таблицу fred с двумя столбцами (id, value) с двумя строками. Первый ряд (1, «синий»), а второй (2, «синий»)

Я даю следующие заявления

INSERT INTO fred VALUES (1,'Red'); [inserts 1 row]
UPDATE fred SET value = 'Blue';    [updates 3 rows but the value on 2 doesn't change]
UPDATE fred SET id = 3 WHERE id = 1; [updates 1 row]
ROLLBACK;

Обе записи изначально в таблице были обновлены. 1 был обновлен дважды. Одна строка была вставлена, а затем обновлена. Затем все эти изменения были отменены. Вопрос в том, какой номер ты хочешь? Количество обновленных записей или общее количество обновлений, выполненных для записей.

С технической точки зрения проще всего получить статистику количество примененных отмененных записей . Но вы должны измерить это до и после. На самом деле, это может привести к путанице, потому что с оператором UPDATE, который сталкивается с одновременной активностью, оператор может быть остановлен на полпути, откат и перезапуск. Ref AskTom

5 голосов
/ 21 мая 2010

На самом деле количество строк, затронутых откатом, составляет ноль . Это потому, что технически эти строки не изменяются до тех пор, пока не произойдет фиксация (A в ACID). И, если вы откатываетесь, фиксация не происходит.

4 голосов
/ 21 мая 2010

Я не знаю, как это сделать с помощью оракула, но вы могли бы потенциально отслеживать ваши созданные / измененные / удаленные строки, используя SQL%ROWCOUNT, чтобы вы знали, что будет затронуто при откате

0 голосов
/ 27 марта 2012
declare
  i number:=0;
begin
  INSERT INTO fred VALUES (1,'Red'); [inserts 1 row]
  i := i + sql%rowcount;
  UPDATE fred SET value = 'Blue';    [updates 3 rows but the value on 2 doesn't change]
  i := i + sql%rowcount;  
  UPDATE fred SET id = 3 WHERE id = 1; [updates 1 row]
  i := i + sql%rowcount;
  if <condition> then
      COMMIT;
      dbms_output.PUT_LINE(i || ' rows COMMITED';
      i := 0;
  else
      ROLLBACK;
      dbms_output.PUT_LINE(i || ' rows ROLLBACK';
      i := 0;
  end if;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...