2015-05-29 118 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

相关问题