有时我尝试在几个模式之间测试场景,删除/修改表,插入/更新/删除查询,一些模式正在测试,其他模式对于生产很重要。所以有时偶然我会在错误的模式中运行查询。所以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;
我不是在寻找闪回。我需要检查截断表
答案 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。