受回滚影响的行数

时间:2010-05-21 04:27:49

标签: oracle plsql

我需要找出受回滚影响的行数。 我怎么能得到这个?请帮忙。

4 个答案:

答案 0 :(得分:6)

考虑一个包含两列(id,value)和两行的表fred。 第一行是(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更新了两次。插入一行然后更新。然后所有这些变化都被回滚。问题是,你想要几号?更新的记录数,或对记录执行的更新总数。

从技术角度来看,最简单的答案是统计number of undo records applied。但是你必须在前后测量它。实际上,它会变得非常混乱,因为使用UPDATE语句命中并发活动,语句可能会在中途停止,回滚并重新启动。参考AskTom

答案 1 :(得分:5)

实际上,受回滚影响的行数。这是因为从技术上讲,这些行在提交之前不会更改(A中的ACID)。而且,如果你回滚,提交不会发生。

答案 2 :(得分:4)

我不知道如何使用oracle执行此操作,但您可以使用SQL%ROWCOUNT跟踪创建/更改/删除的行,以便了解回滚中会受到什么影响

答案 3 :(得分:0)

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;