2010-05-21 220 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