我需要找出受回滚影响的行数。 我怎么能得到这个?请帮忙。
答案 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;