2010-05-21 75 views
3

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

+0

需要更多的信息:你是什么意思“受影响”(c.f. paxdiablo的答案),以及为什么你需要这个? – 2010-05-25 07:06:28

回答

5

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

+0

就是这样。我想知道有多少行被回滚。 – payal 2010-05-21 04:37:32

+0

@payal hes说,由于这些行/更改在技术上不存在,直到您提交它们,您可能必须自己跟踪它们。 – 2010-05-21 04:39:10

+0

@payal,我不认为Oracle提供此信息。回滚(包括保存点)不会更改ROWCOUNT,因此即使尝试手动执行此操作也会产生问题。也许如果你能告诉我们,为什么你需要这个,可能有更好的方法。 – paxdiablo 2010-05-21 04:46:07

4

我不知道的方式与Oracle做到这一点,但你可能会保持跟踪你的创建/修改/删除使用SQL%ROWCOUNT所以你知道什么会在回滚

6

受到影响的行考虑一个表弗雷德有两列的两列(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

+0

+1,请注意,在递归sql回滚(例如,删除级联)的情况下撤消记录可能会引起误解。 – 2012-03-28 04:37:45

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; 
+0

欢迎来到SO,在这里,解释为什么要使用您的解决方案,而不仅仅是如何,这是一个很好的做法。这会让你的答案更有价值,并有助于读者更好地理解你是如何做到的。我还建议你看看我们的FAQ:http://stackoverflow.com/faq。 – ForceMagic 2012-10-29 15:53:34