2015-05-29 119 views
2

有時我會嘗試幾種模式之間的測試場景,刪除/修改表格,插入/更新/刪除查詢,某些模式正在測試,其他模式正在測試,其他模式對於生產而言很重要。所以有時候我偶然會在錯誤的模式下運行查詢。所以在這種情況下commit功能確實有幫助。有沒有辦法檢查截斷表?

然而Truncate table tab1犯規需要提交,如果我在一個錯誤的模式執行它..嗯,你知道scneario。

我的問題:是否有像truncate表的提交0123k陳述的工作周?如果你刪除了一個陳述,你必須包含一個提交,或者在plsql中,你必須點擊綠色按鈕來提交。

我使用這樣的檢查,它真的很煩人,每次我想截斷我必須修改條件。

select count(1) into cnt from tab1 if cnt =0 then execute'Truncate table tab1'; end if; 

我不尋找閃回。我需要檢查截斷表

+0

爲什麼不使用DELETE FROM表?這是一個DML語句,可以被提交或回滾。 – sfrutig

+0

@sfrutig'TRUNCATE'會將高位水印重置爲零,'DELETE'不會。 –

+0

[在Oracle中使用FLASHBACK]可能的重複(http://stackoverflow.com/questions/25950145/use-of-flashback-in-oracle) –

回答

2

正如@Boneist說,截斷DDL聲明,隱含提交。如果您不確定在模式中執行的操作,並且僅在手動驗證後才提交,則不要使用TRUNCATE,而應使用DELETE

使用DELETE語句,您可以控制提交。儘管如此,TRUNCATE會將高水位重置爲零,但是,DELETE不會。即使刪除表中的所有行,Oracle也會掃描HWM下的所有塊。看看這個AskTom link

如果您希望恢復截斷的數據,並且如果您使用的是11gR2或更高版本,則可以使用Flashback support for DDL statements

2

TRUNCATE是一個DDL語句,而不是DML,並且DDL語句自動包含提交。有關更多信息,請參閱https://asktom.oracle.com/pls/asktom/f?p=100:11:0%3A%3A%3A%3AP11_QUESTION_ID:7072180788422

我不完全確定我明白你在做什麼 - 你可以像湯姆所說的那樣,使用自動事務來保持截斷是分開的?如果你是在將提交部分與截斷部分分開的能力之後(即,如果你決定將其稱爲錯誤,則回滾截斷),那麼恐怕你運氣不好。

+0

我試圖避免通過錯誤截斷表,我正在處理不同的模式。我試圖看看是否有一種方法可以使自動提交類似。 – Baalback

相關問題