有没有办法检查截断表?

时间:2015-05-29 08:09:11

标签: sql oracle commit truncate

有时我尝试在几个模式之间测试场景,删除/修改表,插入/更新/删除查询,一些模式正在测试,其他模式对于生产很重要。所以有时偶然我会在错误的模式中运行查询。所以commit功能在这种情况下确实有用。

然而Truncate table tab1不需要提交,如果我在错误的架构中执行它......那么你就知道了scneario。

我的问题:是否有类似{b> truncate 表的提交,如DML声明?如果您删除了一个法令,则必须包含一个提交,或者在plsql中,您必须单击绿色按钮才能提交。

我使用这样的检查,每次我想截断它真的很烦我必须修改条件。

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

我不是在寻找闪回。我需要检查截断表

2 个答案:

答案 0 :(得分:2)

TRUNCATE是DDL语句,而不是DML,DDL语句自动包含提交。有关详细信息,请参阅https://asktom.oracle.com/pls/asktom/f?p=100:11:0%3A%3A%3A%3AP11_QUESTION_ID:7072180788422

我不完全确定我明白你要做的是什么 - 你可以像汤姆所说的那样,使用自主交易来保持截断分开吗?如果你能够将提交部分与截断部分分开(即,如果你决定错误地调用它,则回滚截断),那么我恐怕你运气不好。

答案 1 :(得分:2)

正如@Boneist所说,截断 DDL 语句,其中隐式提交。如果您不确定在模式中执行的操作,并且只想在手动验证后提交,则不要TRUNCATE,而是使用 DELETE

使用DELETE语句,您可以控制提交。话虽如此,TRUNCATE将高水位重置为零,但DELETE没有。即使您从表中删除了所有行,Oracle也会扫描HWM下的所有块。看看这个AskTom link

如果您要恢复截断的数据,如果您使用的是11gR2以上,则可以使用Flashback support for DDL statements

相关问题