受回滚影响的行数
实际上,受回滚影响的行数是零。这是因为在技术上,这些行在发生提交之前不会更改(A
在ACID
中)。而且,如果你回滚,提交不会发生。
我不知道的方式与Oracle做到这一点,但你可能会保持跟踪你的创建/修改/删除使用SQL%ROWCOUNT
所以你知道什么会在回滚
受到影响的行考虑一个表弗雷德有两列的两列(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更新了两次。插入一行然后更新。然后所有这些变化都回滚了。问题是,你想要什么号码?更新的记录数,或对记录执行的更新总数。
从技术角度来看,最简单的答案是统计信息number of undo records applied。但是你必须在之前和之后进行测量。实际上,它会变得非常混乱,因为使用UPDATE语句触及并发活动时,语句可能会部分停止,回滚并重新启动。参考AskTom
+1,请注意,在递归sql回滚(例如,删除级联)的情况下撤消记录可能会引起误解。 – 2012-03-28 04:37:45
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;
欢迎来到SO,在这里,解释为什么要使用您的解决方案,而不仅仅是如何,这是一个很好的做法。这会让你的答案更有价值,并有助于读者更好地理解你是如何做到的。我还建议你看看我们的FAQ:http://*.com/faq。 – ForceMagic 2012-10-29 15:53:34
需要更多的信息:你是什么意思“受影响”(c.f. paxdiablo的答案),以及为什么你需要这个? – 2010-05-25 07:06:28